Scipy.optimize.root 在 Matlab fsolve 工作时不收敛于 Python,为什么?
Scipy.optimize.root does not converge in Python while Matlab fsolve works, why?
我正在尝试使用 Python 查找名为 f 的函数的根 y。
这是我的代码:
def f(y):
w,p1,p2,p3,p4,p5,p6 = y[:7]
t1 = w - 0.99006633*(p1**0.5) - (-1.010067)*((1-p1))
t2 = w - 22.7235687*(p2**0.5) - (-1.010067)*((1-p2))
t3 = w - 9.71323491*(p3**0.5) - (-1.010067)*((1-p3))
t4 = w - 2.43852877*(p4**0.5) - (-1.010067)*((1-p4))
t5 = w - 3.93640207*(p5**0.5) - (-1.010067)*((1-p5))
t6 = w - 9.22688144*(p6**0.5) - (-1.010067)*((1-p6))
t7 = p1 + p2 + p3 + p4 + p5 + p6 - 1
return [t1,t2,t3,t4,t5,t6,t7]
x0 = np.array([-0.01,0.4,0.1,0.2,0.1,0.1,0.1])
sol = scipy.optimize.root(f, x0)
print sol
Python 没有找到根。但是有一个,我在Matlab中用函数fsolve找到的。
是:
[0.3901、0.6166、0.0038、0.0202、0.2295、0.1076、0.0223]
我真的很想用Python。谁能解释为什么 Python 中的 scipy.optimize.root 不收敛而 Matlab 中的 fsolve 收敛?
供参考,scipy.optimize.solve也不收敛。
尝试不同的方法。对我来说,method="lm"
(我猜是 Levenberg-Marquardt,但我不完全确定)效果很好:
import numpy as np
import scipy.optimize
def f(y):
w,p1,p2,p3,p4,p5,p6 = y[:7]
t1 = w - 0.99006633*(p1**0.5) - (-1.010067)*((1-p1))
t2 = w - 22.7235687*(p2**0.5) - (-1.010067)*((1-p2))
t3 = w - 9.71323491*(p3**0.5) - (-1.010067)*((1-p3))
t4 = w - 2.43852877*(p4**0.5) - (-1.010067)*((1-p4))
t5 = w - 3.93640207*(p5**0.5) - (-1.010067)*((1-p5))
t6 = w - 9.22688144*(p6**0.5) - (-1.010067)*((1-p6))
t7 = p1 + p2 + p3 + p4 + p5 + p6 - 1
return [t1,t2,t3,t4,t5,t6,t7]
x0 = np.array([-0.01,0.4,0.1,0.2,0.1,0.1,0.1])
sol = scipy.optimize.root(f, x0, method='lm')
assert sol['success']
print 'Solution: ', sol.x
print 'Misfit: ', f(sol.x)
这产生:
Solution: [ 0.39012036 0.61656436 0.00377616 0.02017937 0.22954825
0.10763827 0.02229359]
Misfit: [0.0, 0.0, 1.1102230246251565e-16, -1.1102230246251565e-16,
1.1102230246251565e-16, 0.0, -2.2204460492503131e-16]
我真的有点惊讶 Levenberg-Marquardt 不是默认值。它通常是人们会尝试的第一个 "gradient-descent" 风格求解器。
我正在尝试使用 Python 查找名为 f 的函数的根 y。
这是我的代码:
def f(y):
w,p1,p2,p3,p4,p5,p6 = y[:7]
t1 = w - 0.99006633*(p1**0.5) - (-1.010067)*((1-p1))
t2 = w - 22.7235687*(p2**0.5) - (-1.010067)*((1-p2))
t3 = w - 9.71323491*(p3**0.5) - (-1.010067)*((1-p3))
t4 = w - 2.43852877*(p4**0.5) - (-1.010067)*((1-p4))
t5 = w - 3.93640207*(p5**0.5) - (-1.010067)*((1-p5))
t6 = w - 9.22688144*(p6**0.5) - (-1.010067)*((1-p6))
t7 = p1 + p2 + p3 + p4 + p5 + p6 - 1
return [t1,t2,t3,t4,t5,t6,t7]
x0 = np.array([-0.01,0.4,0.1,0.2,0.1,0.1,0.1])
sol = scipy.optimize.root(f, x0)
print sol
Python 没有找到根。但是有一个,我在Matlab中用函数fsolve找到的。
是:
[0.3901、0.6166、0.0038、0.0202、0.2295、0.1076、0.0223]
我真的很想用Python。谁能解释为什么 Python 中的 scipy.optimize.root 不收敛而 Matlab 中的 fsolve 收敛?
供参考,scipy.optimize.solve也不收敛。
尝试不同的方法。对我来说,method="lm"
(我猜是 Levenberg-Marquardt,但我不完全确定)效果很好:
import numpy as np
import scipy.optimize
def f(y):
w,p1,p2,p3,p4,p5,p6 = y[:7]
t1 = w - 0.99006633*(p1**0.5) - (-1.010067)*((1-p1))
t2 = w - 22.7235687*(p2**0.5) - (-1.010067)*((1-p2))
t3 = w - 9.71323491*(p3**0.5) - (-1.010067)*((1-p3))
t4 = w - 2.43852877*(p4**0.5) - (-1.010067)*((1-p4))
t5 = w - 3.93640207*(p5**0.5) - (-1.010067)*((1-p5))
t6 = w - 9.22688144*(p6**0.5) - (-1.010067)*((1-p6))
t7 = p1 + p2 + p3 + p4 + p5 + p6 - 1
return [t1,t2,t3,t4,t5,t6,t7]
x0 = np.array([-0.01,0.4,0.1,0.2,0.1,0.1,0.1])
sol = scipy.optimize.root(f, x0, method='lm')
assert sol['success']
print 'Solution: ', sol.x
print 'Misfit: ', f(sol.x)
这产生:
Solution: [ 0.39012036 0.61656436 0.00377616 0.02017937 0.22954825
0.10763827 0.02229359]
Misfit: [0.0, 0.0, 1.1102230246251565e-16, -1.1102230246251565e-16,
1.1102230246251565e-16, 0.0, -2.2204460492503131e-16]
我真的有点惊讶 Levenberg-Marquardt 不是默认值。它通常是人们会尝试的第一个 "gradient-descent" 风格求解器。