Python求解欠定非线性方程组时scipy.least_squares广播错误咨询
问题解答
1. 报错原因
你遇到的报错完全是参数传入和维度计算的逻辑错误,和least_squares是否支持欠定系统无关,具体错误有两处:
- 初始值维度不匹配:你求解的是4个未知数的方程组,但调用
least_squares时传入的初始猜测是长度为5的数组np.asarray((1,1,1,1,1)),维度直接对不上。 - 自定义函数
f的广播逻辑错误:你的Lins数组形状是(2,4,3)(2个方程、4个未知数对应多项式、3项系数),当输入x是长度为4的向量时,你构造的X没有对齐维度,导致两个数组无法广播相乘。
2. 欠定系统适配性说明
scipy.optimize.least_squares本身完全支持求解欠定非线性系统,它默认使用的TRF算法可以处理方程数少于未知数的场景,输出最小二乘意义下的最优解。
3. 修正后可运行代码
import numpy as np from scipy.optimize import least_squares # 原始输入系数 Lins = np.array([[[1, 2, 3], [4, 5, 6], [1, 5, 2], [5, 2, 6]], [[7, 2, 3], [4, 5, 6], [5, 8, 7], [2, 1, 4]]], np.int32) b = np.array([52, 62]) # 修正后的方程组构造函数 def f(x): # x为长度4的向量,对应x1~x4 X = np.array([x**2, x, np.ones_like(x)]).T # 形状(4,3),每行对应一个未知数的[二次项,一次项,常数项] X = X[np.newaxis, :, :] # 扩展维度为(1,4,3),匹配Lins的(2,4,3)广播规则 return np.sum(Lins * X, axis=(1, 2)) # 修正初始值为4个1,调用求解器 x_sol = least_squares(lambda x: f(x) - b, np.ones(4), bounds=(0, 1)).x print("求得的解x1~x4:", x_sol) print("代入方程计算结果:", f(x_sol))
内容的提问来源于stack exchange,提问作者David_D
相关产品推荐
相关产品推荐

