假设我有一个等式
x + 2*cos(x) = 0我想解决这个问题。然后我可以编写以下代码:
def func1(x):
out = x + 2*cos(x)
return out
Solution = fsolve(func1, StartValue)在本例中,StartValue可以有一个任意值。到目前一切尚好!我正在编写一个模拟程序,它创建了一个非线性方程系统,我想用fsolve()来求解它。现在的挑战是(!)在运行时间之前,非线性方程组的大小是未知的(!)。例如,这意味着我可以拥有
X+ 2*cos(x) =0
就像我能拥有的一样
2*x + 4*y = 0
18*y -18 = 0为了求解最后提到的方程组(在我的程序中通常是非线性的),我找到了以下解决方案:
def func2(x):
out = [2*x[0] + 4*x[1]]
out.append(18*x[1]-18)
return out
Solution = fsolve(func2, [1, 1])这也运行得很好。但是,我不能使用func2(X)的解决方案是有原因的:它使我的程序非常慢!函数fsolve()多次迭代调用函数func2(x),直到找到解为止。但我的程序将处理数百行的线性方程组。这意味着在每个迭代步骤中,所有这些thousend行都会被追加,如func2(x)中所示。因此,我正在寻找一种解决方案,一旦将方程系统创建为函数func3(x),然后fsolve()只调用现成的func3(x)。下面是一个伪代码示例:
func3 = lambda x: 2*x[0] + 4*x[1]
func3.append(lambda x: 18*x[1] - 18)
Solution = fsolve(func3, [1, 1])不幸的是,函数不能被附加,正如我在上面的伪代码中所展示的。因此,我的问题是:如何动态构建函数func3,然后传递( !)一旦准备好构建(!)函数func3 to fsolve()?
非常感谢你提前
发布于 2013-02-19 16:48:26
解决方案:“将命令外包为字符串连接”可以在函数外部构建一个字符串,如下所示:
StringCommand = "f = [2*x[0] + 4*x[1], 18*x[1] - 18]"之后,该StringCommand被用作要调用的函数的输入参数,如下所示:
def func(x,StringCommand):
exec StringCommand
return f 因此,StringCommand是通过命令exec执行的。最后,只需调用fsolve()中的函数,如下所示:
fsolve(func, [1, 1], StringCommand)就这样。通过这种方式,StringCommand在函数func()外部构建一次,因此当fsolve()使用函数func()进行迭代时,可以节省大量时间。请注意,1,1是迭代的起始值!
https://stackoverflow.com/questions/14902730
复制相似问题