【问题标题】:Python scipy fsolve to solve a large number of nonlinear equationspython scipy fsolve求解大量非线性方程
【发布时间】:2019-06-18 21:16:07
【问题描述】:

我想使用 Python 求解一个由 6 个非线性方程组成的系统。我发现我可以很容易地使用scipyfsolve 来求解3 个非线性方程组。但是,当我将其扩展到更大的系统时,我发现该解决方案无法解决方程组。有什么我可以纠正的东西可以解决 6 个非线性方程吗?

import numpy as np
from scipy.optimize import fsolve

def system(z):
   #arbitrary system of 3 nonlinear equations
   x1 = z[0]
   x2 = z[1]
   x3 = z[2]

   F = np.empty((3))
   F[0] = 20* x1 + x2**2
   F[1] = x2 - x1
   F[2] = x3 + 5 - x1*x2

   return F

def system2(z):
   #arbitrary system of 6 nonlinear equations
   x1 = z[0]
   x2 = z[1]
   x3 = z[2]
   x4 = z[3]
   x5 = z[4]
   x6 = z[5]

   F = np.empty((6))
   F[0] = 20* x1 + x2**2
   F[1] = x2 - x1
   F[2] = x3 + 5 - x1*x2
   F[3] = x3 + x2
   F[4] = x5 + x4**2
   F[5] = x6**2 + x1 - 20

   return F

uInitial = np.array([1,1,1])
u = fsolve(system,uInitial)
print('Solution: ',u)
print('Solution check: ',system(u),'\n') #yields zeros as expected

vInitial = np.array([1,1,1,1,1,1])
v = fsolve(system2,vInitial)
print('Solution: ',v)
print('Solution check: ',system2(v)) #unexpectedly does not yield zeros. Equations not solved correctly.

当将给定的解应用回方程组时,我应该期望收到零(或接近零)。这将确认计算的解决方案解决了给定的方程组。我尝试用这种方法检查 3 个方程组和 6 个方程组,但只有 3 个方程组才能通过这个检查正确求解。求解 6 个非线性方程组的方法是什么?

【问题讨论】:

    标签: python nonlinear-functions


    【解决方案1】:

    您的系统不一致,您最初的猜测是错误的。尝试将第四个方程添加到第一个三个方程组:

    F[0] = 20 * x1 + x2**2  # "first" equation
    F[1] = x2 - x1  # "second" (=> x1 == x2)
    F[2] = x3 + 5 - x1*x2  # "third"
    F[3] = x3 + x2  # "fourth" equation (=> x3 == -x2)
    

    首先,让我们求解前三个方程。从第二个等式可以得出x1 等于x2。因此第一个方程可以改写为:

    F[0] = 20 * x1 + x1**2
    

    这导致x1 = -20(和x2 = -20)。在第三个等式中使用它会导致x3 = 395。尝试将第一个系统的初始条件修改为uInitial = np.array([-30, -30, 1]) - 你应该得到正确的答案。

    现在,让我们求解所有四个方程。第三个等式,利用x2 == x1这一事实,可以重写为:

    F[2] = x3 + 5 - x1**2
    

    从第四个等式可以得出x3 == -x2(以及x3 == -x1)。因此,这个方程可以重写为x3 + 5 - x3**2 == 0 => x3 = 0.5 +(-) sqrt(21)/2,这与我们上面使用前三个方程得到的395不同。

    这表明你有一个不一致的方程组,它没有解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-06
      • 2018-07-18
      • 2023-03-10
      • 2019-01-15
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 2020-07-13
      相关资源
      最近更新 更多