使用scipy least_squares的LM方法报错TypeError,求解决方案
解决
scipy.optimize.least_squares的TypeError问题及LM方法适用性说明 嘿,我来帮你搞定这个问题!
错误的直接原因
你遇到的TypeError: integer argument expected, got float是因为max_nfev参数传错了类型:你写的1e6是浮点数,但这个参数要求传入整数。把它改成整数形式1000000就可以解决这个报错了。
LM方法的适用性
你完全不用担心没有手动提供雅可比矩阵的问题——least_squares的LM方法会自动通过数值微分计算雅可比矩阵,所以这个方法完全适用于你的测试问题。另外,LM方法要求残差的数量≥变量的数量,你的问题里残差是2个、变量是2个,刚好满足这个条件,没问题。
修正后的代码
import numpy as np from scipy.optimize import least_squares a = 2 b = -1 def myfun(x, a, b): return [a*x[0]-x[1]-np.exp(-x[0]), b*x[0]+2*x[1]-np.exp(-x[1])] x0 = [-5,-5] # 把max_nfev的1e6改成整数1000000 sol = least_squares(myfun, x0, method='lm', ftol=1e-9, xtol=1e-9, max_nfev=1000000, args=(a,b)) print(sol.x) # 输出会是array([0.56714329, 0.56714329]),和trf方法的结果一致
运行修正后的代码,你就能得到和trf方法一样的正确解了。
内容的提问来源于stack exchange,提问作者Medulla Oblongata
相关产品推荐
相关产品推荐

