首页 > 解决方案 > 使用 Python 使用 scipy fsolve 或 scipy.optimize.root 解决非线性系统的问题

问题描述

我有一个关于在 python 中求解方程组的问题。在这里,我提出了一个有 5 个方程的情况。显式系统是这样的:

定义 f(x):

F = numpy.array([x[0]*x[2]/(1+x[0]*x[2]) + x[0]*x[3]/(1+x[0]*x[3]) + x[0]*x[4]/(1+x[0]*x[4]) -2,
     x[1]*x[2]/(1+x[1]*x[2]) + x[1]*x[3]/(1+x[1]*x[3]) + x[1]*x[4]/(1+x[1]*x[4]) - 2,
     x[0]*x[2]/(1+x[0]*x[2]) + x[1]*x[2]/(1+x[1]*x[2]) -1,
     x[0]*x[3]/(1+x[0]*x[3]) + x[1]*x[3]/(1+x[1]*x[3]) -2,
     x[0]*x[4]/(1+x[0]*x[4]) + x[1]*x[4]/(1+x[1]*x[4]) -1,])

return F

我尝试过的另一种方法是:

    F = numpy.zeros(5)
    d = numpy.array([2,2])
    u = numpy.array([1,2,1])

    def f(x):
        for i in range(2):
            for k in range(3):
               F[i] += x[i]*x[k+2]/(1+x[i]*x[k+2])
            F[i] = F[i] - d[i]
        for i in range(3):
            for k in range(2):
               F[i+2] += x[i+2]*x[k]/(1+x[k]*x[i+2])
            F[i+2] = F[i+2] - u[i]
        return F

现在,当我尝试:

    a = [1,1,0.5,1,0,5] #initial guess
    sol = fsolve(f,a)

第一个方法似乎没问题,并给出了解决方案:

    array([2.63229589e+01, 2.63229589e+01, 3.79966918e-02, 2.11613301e+02,3.79966918e-02])

相反,第二个给出了初始猜测作为解决方案,因此,显然,什么都没有发生:

    array([1. , 1. , 0.5, 1. , 0.5])

我不明白为什么第二种方法不起作用。我写了第二种情况,因为我必须解决的真实系统有数百个方程和数百个项(它们是求和的结果),所以我不能明确地写出来。这种只有 5 个方程的情况是我尝试过的简化情况,但我仍然不明白问题出在哪里。当我定义系统的方程 F 时,我认为在 f(x) 中具有“for”迭代循环,但是,我再一次不知道出了什么问题。

谁能帮我?

标签: pythonscipy-optimize

解决方案


推荐阅读