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

Python调用Matlab fsolve报错及Scipy优化求解形状不匹配问题

问题解决方法

一、SciPy fsolve/root 输入输出形状不匹配问题

SciPy的fsolve和root求解器要求目标函数的输出维度必须与输入维度一致(方程数=变量数)。你的函数输入是12×1向量(12个变量),输出是6×3矩阵(18个元素),属于超定方程组(方程数>变量数),这类问题不适合用fsolve/root,建议改用最小二乘求解器scipy.optimize.least_squares,它支持输出维度大于输入维度,目标是最小化残差的平方和。

具体修改步骤:

  1. 将目标函数的输出矩阵展平为一维数组(比如把6×3矩阵转成18×1向量)。
  2. 调用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函数文件

  1. 创建myfunc.m文件,内容如下:
function y = myfunc(x)
    y = x(1)^2 + x(2)^2 - 25;
end
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:54:28