Python中预定义符号变量数组的求值方法及MATLAB代码转换
MATLAB符号计算转Python实现方案
一、修正后的Python完整代码
你原有代码的核心问题在于符号求值逻辑错误、矩阵乘法规则不匹配、变量名冲突三个点,修正后可直接运行的代码如下:
from sympy import symbols, lambdify import numpy as np # 数值输入:避免使用Python内置关键字input作为变量名 input_val = np.array([[10, 20, 30], [15, 25, 20], [20, 20, 10]]) # 直接生成3x3符号数组,命名规则和MATLAB完全对齐 symbolic_eq = np.array([[symbols(f'x_{i+1}_{j+1}') for j in range(3)] for i in range(3)]) # 系数矩阵 m = np.array([[-1, 0, 0 ], [ 0, -1, 0 ], [ 0, 1, -1 ]]) # 矩阵乘法:@运算符对应MATLAB的*矩阵运算,不要用*(逐元素相乘) multp_eq = m @ symbolic_eq # 方法1:小数据量直接用subs批量替换求值 replace_dict = {symbolic_eq[i,j]: input_val[i,j] for i in range(3) for j in range(3)} results = np.array([[expr.subs(replace_dict) for expr in row] for row in multp_eq], dtype=float) # 方法2:大数据量用lambdify转数值函数,性能提升明显 # calc_func = lambdify(symbolic_eq.flatten(), multp_eq.flatten(), 'numpy') # results = calc_func(*input_val.flatten(order='F')).reshape(3,3)
关键修改说明:
- 变量名修正:避免使用Python内置函数名
input作为变量,防止命名冲突 - 符号数组定义:直接生成3x3符号数组,无需先生成4x4数组再裁剪
- 运算规则对齐:用
@实现矩阵乘法,和MATLAB的*运算逻辑完全一致 - 求值逻辑替换:Python内置
eval不支持SymPy表达式直接求值,改用SymPy原生的subs/lambdify方案,更安全也符合符号计算规范
二、input变量便捷定义方法
MATLAB端
MATLAB默认列优先索引,你需要的x_i_j对应input矩阵的列向展开值,可通过reshape一行定义,无需手动分行写:
% 按列优先顺序输入数值,直接reshape为3x3矩阵 input = reshape([10,15,20,20,25,20,30,20,10],3,3);
如果需要批量生成x_1_1这类变量,无需逐个赋值,用循环+assignin实现:
for i = 1:3 for j = 1:3 assignin('base', sprintf('x_%d_%d',i,j), input(i,j)) end end
Python端
Numpy默认行优先索引,要和MATLAB索引逻辑对齐,reshape时指定order='F'即可:
# 列优先reshape,和MATLAB索引逻辑完全一致 input_val = np.array([10,15,20,20,25,20,30,20,10]).reshape((3,3), order='F')
无需单独定义一堆x_*变量,直接用字典存储变量映射关系,给符号计算传参更方便:
var_dict = {f'x_{i+1}_{j+1}': input_val[i,j] for i in range(3) for j in range(3)}
内容的提问来源于stack exchange,提问作者max
相关产品推荐
相关产品推荐

