Python调用Matlab fsolve报错及Scipy优化求解形状不匹配问题
问题解决方法
一、SciPy fsolve/root 输入输出形状不匹配问题
SciPy的fsolve和root求解器要求目标函数的输出维度必须与输入维度一致(方程数=变量数)。你的函数输入是12×1向量(12个变量),输出是6×3矩阵(18个元素),属于超定方程组(方程数>变量数),这类问题不适合用fsolve/root,建议改用最小二乘求解器scipy.optimize.least_squares,它支持输出维度大于输入维度,目标是最小化残差的平方和。
具体修改步骤:
- 将目标函数的输出矩阵展平为一维数组(比如把6×3矩阵转成18×1向量)。
- 调用
least_squares求解,示例代码框架:
import numpy as np from scipy.optimize import least_squares def your_func(x): # x是12×1的输入向量 # 原计算逻辑,得到6×3的矩阵output_mat output_mat = ... # 你的计算代码 # 展平为一维数组返回 return output_mat.flatten() # 初始猜测值(12×1向量) x0 = np.random.rand(12) # 求解 result = least_squares(your_func, x0) # 查看结果 print(result.x)
二、Python调用MATLAB fsolve 传递函数报错问题
MATLAB引擎无法直接识别Python的函数/ lambda对象,必须传递MATLAB可识别的函数形式,有两种解决方式:
方式1:编写MATLAB函数文件
- 创建
myfunc.m文件,内容如下:
function y = myfunc(x) y = x(1)^2 + x(2)^2 - 25; end
- 在Python中调用时,确保该文件在MATLAB的搜索路径中,然后传递函数名字符串:
import matlab.engine eng = matlab.engine.start_matlab() # 添加函数所在文件夹到MATLAB路径(如果不在默认路径) eng.addpath('C:/path/to/your/mfile_folder', nargout=0) # 调用fsolve result = eng.fsolve('myfunc', eng.rand(2,1)) print(result) eng.quit()
方式2:在MATLAB引擎中定义匿名函数
直接在Python中通过MATLAB引擎的eval命令定义MATLAB匿名函数,再调用:
import matlab.engine eng = matlab.engine.start_matlab() # 在MATLAB环境中定义匿名函数 eng.eval('myfunc = @(x) x(1)^2 + x(2)^2 - 25;', nargout=0) # 调用fsolve result = eng.fsolve('myfunc', eng.rand(2,1)) print(result) eng.quit()
内容的提问来源于stack exchange,提问作者Ajai
相关产品推荐
相关产品推荐

