具有多个方程的Scipy方程系统

时间:2018-11-19 05:52:55

标签: python-3.x scipy equation equation-solving

你好,当我有一个方程组时,我使用Scipy的fsolve函数会遇到问题。

我的代码仅让我拥有与系统中方程相同的变量,但是我们都知道,实际上,方程可以多于变量,尤其是当解决方案不是具体数字而是一定范围的数字时,另外一个等式可以帮助缩小“干草堆”的范围。

我的问题是如何插入比变量更多的方程式?

假设我有以下非线性系统:

A/B=0.4583(3)
A/C=0.25
A/D=0.72(2)
B/C=0.54(54)

所以我有以下代码:

from scipy.optimize import *
from numpy  import *

def FUNC(arg):

    A,B,C,D=arg
    UNK=empty((4))  

    UNK[0]= A/B-0.458333333333333
    UNK[1]= A/C-0.25
    UNK[2]= A/D-0.722222222222222
    UNK[3]= B/C-0.545454545454546

    return UNK


SOLVED= fsolve(FUNC, [1.0]*4)

print (SOLVED)

问题是我也知道以下信息:

B/D=1.57(57)
C/D=2.8(8)

如何将这两个附加方程式插入方程式系统?

我也如何显示解决方案的范围,而不是仅显示1个解决方案,看来fsolve仅显示遇到的第一个解决方案,而不显示可能的全部解决方案。

1 个答案:

答案 0 :(得分:0)

请注意,scipy的fsolve只是MINPACK的hybrd例程的包装:

  

HYBRD的目的是通过修改Powell混合方法在N个变量中找到N个非线性函数系统的零点。用户必须提供一个计算功能的子程序。然后通过前向差异近似来计算雅可比行列式。

如果要求解6个方程式的系统,则函数FUNC必须是6个变量的函数。我们可以这样做:

import numpy as np
from scipy.optimize import fsolve

def FUNC(arg):
    A, B, C, D, E, F = arg
    UNK=np.empty((6))  

    UNK[0]= A/B-0.458333333333333
    UNK[1]= A/C-0.25
    UNK[2]= A/D-0.722222222222222
    UNK[3]= B/C-0.545454545454546
    UNK[4]= B/D-1.575757575757575
    UNK[5]= C/D-2.888888888888888
    return UNK

fsolve(FUNC, x0=[1.0]*6)

不可能用fsolve获得所有解决方案。但是您可以尝试使用不同的初始点x0,以期获得不同的解决方案。