如何在python中使用fsolve正确求解非线性方程组

时间:2019-04-29 11:32:40

标签: python sympy

我正在尝试求解非线性方程组。

为此,我成功地使用sympy在线求解了一个由三个方程组成的系统。但这对7个方程式不再起作用,并向我返回“操作超时”消息。 因此,我正在尝试使用标准的fsolve来解决问题。但是,尽管我仅用三个简单的方程组就可以得到很好的sympy效果,但fsolve给我带来不好的结果。

这是我编写的代码(由于在此论坛上发现的内容):

def equations(p):
    w1, w2, m = p
    f0 = w1+w2-1
    f1 = w1*m+w2*(1-2*m)-1/3
    f2 = w1*m**2+w2*(1-2*m)**2-1/5
    return (f0,f1,f2)

w1, w2, m = fsolve(equations, (0,0,0))
print equations((w1,w2,m))

作为回报,它给了我这些(负面...)结果:

(0.0, -1.2378986724570495e-13, 5.1419979385514125e-13)

作为比较,sympy给了我预期的结果。它给出了大约:

(0.333333, 0.666667, 0,122515)

您知道为什么在我的情况下fsolve无法正常工作吗?

谢谢。

1 个答案:

答案 0 :(得分:4)

使用mobile_no,将在点(w1,w2,m)上打印(f0,f1,f2)的值。而是,sympy返回(w1,w2,m)的值。

因此,如果我将打印语句替换为db.collection('users_nippon').aggregate([ { $lookup: { from: "orders", localField: "mobile_no", foreignField: "user_mob", as: "orders_data" } }, { $unwind: "$orders_data" }, { $lookup: { from: "items", localField: "orders_data.item", foreignField: "item", as: "items_data" } }, { $unwind: "$items_data" } ]).toArray(function(err, list) { if (err) throw err; console.log(JSON.stringify(list)); res.send(JSON.stringify(list)); }); ,则会得到(0.6666666666319606、0.33333333336803944、0.12251482264361727)。

答案是不同的,因为方程是非线性的并且可以有多个零。