fsolve即使给定解决方案也无法找到解决方案

问题描述 投票:-1回答:1

我通过这个简单的代码重现了我遇到的问题。

为了验证fsolve正在使用下面的函数,我使用下面的t值预先计算了函数值,这样我确信t1到t4是一个解决方案。

但即使给出解决方案点,fsolve总是返回相同的解决方案[1.50000000e + 02 7.00000000e-01 2.00000000e + 02 1.00000000e-01]

我做错了什么?有没有办法在解决方案上设置约束,例如所有t变量都在0到1000之间?

t1 = 150.0
t2 = 0.7
t3 = 200.00 
t4 = 0.1 

def FS(z):
    x1=z[0]
    x2=z[1]
    x3=z[2]
    x4=z[3]

    f = np.zeros(4)
    f[0] = x1*x2 + x3*x4 - 125.0
    f[1] = (x1**2/500)*x2 + (x3**2/500)*x4 - 39.5
    f[2] = (x1**3/500**2)*x2 + (x3**3/500**2)*x4 - 12.649999999999999
    f[3] = (x1**4/500**3)*x2 + (x3**4/500**3)*x4 - 4.115
    return f

res = fsolve(FS, [t1, t2, t3, t3])
print(res)

[1.50000000e + 02 7.00000000e-01 2.00000000e + 02 1.00000000e-01]

python-3.x numpy scipy
1个回答
1
投票

首先,我没有看到你的问题。该算法按预期收敛(一个)解决方案。当您在起始值中偏离解决方案时,甚至会发生这种情况,例如

t1 = 10
t2 = 10
t3 = 190
t4 = 10

这引起了解决方案[150, 0.7, 200, 0.1]。但部分问题可能是您有多个解决方案。试试吧

 t1 = 190
 t2 = 10
 t3 = 10
 t4 = 10

如果[t1, t2, t3, t4]是一个解决方案,那么[t3, t4, t1, t2]也是一个解决方案。这可能使得算法对于像[1, 1, 1, 1]这样的某些起始值不收敛。 See some discussion about the underlying algorithm for instance here

© www.soinside.com 2019 - 2024. All rights reserved.