在python非线性方程的求解动态数(solving dynamic number of non-l

2019-09-26 12:59发布

FsolveScipy似乎是这个合适的人选,我只是需要帮助传递方程动态。 我感谢提前任何想法。

通过动态我的意思是一些公式从一个运行的不同而不同,例如一个情况下,我有:

alpha*x + (1-alpha)*x*y - y = 0
beta*x  + (1- beta)*x*z - z = 0
A*x + B*y + C*z = D

而另一种情况,我有:

alpha*x + (1-alpha)*x*y - y = 0
beta*x  + (1- beta)*x*z - z = 0
gama*x  + (1 -gama)*x*w - w =0
A*x + B*y + C*z + D*w = E

alphabetaABCDE都是常数。 xyzw是变量。

Answer 1:

我没有用Fsolve自己,但按照它的文档需要一个可调用的函数。 像这样的东西处理与数目不详的变量多种功能。 请记住,在ARGS必须正确这里订购,但在每一个功能简单地接受一个列表。

def f1(argList):
    x = argList[0]
    return x**2
def f2(argList):
    x = argList[0]
    y = argList[1]
    return (x+y)**2
def f3(argList):
    x = argList[0]
    return x/3

fs = [f1,f2,f3]
args = [3,5]
for f in fs:
    print f(args)

对于Fsolve,你可以尝试这样的事情(未经测试):

def func1(argList, constList):
    x = argList[0]
    y = argList[1]
    alpha = constList[0]
    return alpha*x + (1-alpha)*x*y - y
def func2(argList, constList):
    x = argList[0]
    y = argList[1]
    z = argList[2]
    beta = constList[1]
    return beta*x  + (1- beta)*x*z - z
def func3(argList, constList):
    x = argList[0]
    w = argList[1] ## or, if you want to pass the exact same list to each function, make w argList[4]
    gamma = constList[2]
    return gama*x  + (1 -gama)*x*w - w
def func4(argList, constList):

    return A*x + B*y + C*z + D*w -E ## note that I moved E to the left hand side


functions = []
functions.append((func1, argList1, constList1, args01))
# args here can be tailored to fit your  function structure
# Just make sure to align it with the way you call your function:
# args = [argList, constLit]
# args0 can be null.
functions.append((func1, argList2, constList2, args02))
functions.append((func1, argList3, constList3, args03))
functions.append((func1, argList4, constList4, args04))

for func,argList, constList, args0 in functions: ## argList is the (Vector) variable you're solving for.
    Fsolve(func = func, x0 = ..., args = constList, ...)


文章来源: solving dynamic number of non-linear equations in python