You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 10:12:00