2012-04-05 84 views
1

FsolveScipy似乎是这个的合适人选,我只需要帮助动态地传递方程。我很欣赏任何想法。求解python中的非线性方程的动态数量

通过动态我的意思是方程的数目从一个运行的不同而不同,例如一种情况下我有:

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 

alphabetaAB,C,DE都是常数。 x,y,zw是变量。

+0

我打了SciPy的,但我没有成功与活力的部分。你基本上需要事先为你的方程式定义函数,这不是我想要的。然后我在R.中研究了BBsolve,似乎解决了我寻求的问题。 – pouria3 2012-04-10 06:03:37

回答

1

我还没有使用Fsolve自己,但根据它的文档它需要一个可调用的函数。 像这样的东西可以处理多个变量数量未知的函数。请记住,这里的参数必须正确排序,但每个函数都只需要一个列表。

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, ...) 
+0

非常感谢您的帮助和洞察力。我的问题之一是,我不知道我有多少个方程式,所以我不能真正定义它们的功能。 – pouria3 2012-04-05 18:22:25

+0

从哪里获得方程列表的来源是什么?你可以动态地定义它们并追加到列表中,但是这将专门为方程式的源格式量身定制 – 2012-04-05 19:44:40

+0

@ pouria3在python中,几乎所有事情都是在运行时发生的。在运行时你应该知道你拥有多少个equi,因为你有*他们。您不必事先知道* * – Simon 2012-04-06 09:05:53