让我们说我有一个等式
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),直到找到解[-2 1]。但是我的程序将处理一个线性方程组 几百行到thousend行。这意味着在每个迭代步骤中,所有这些thousends行都被附加,因为它在func2(x)中显示。因此,我正在寻找一种解决方案,ONCE创建方程组作为函数func3(x),然后fsolve()只调用现成的func3(x)。这是一个PSEUDO CODE示例:
func3 = lambda x: 2*x[0] + 4*x[1]
func3.append(lambda x: 18*x[1] - 18)
Solution = fsolve(func3, [1, 1])
不幸的是,我在上面的PSEUDO CODE中显示的功能无法附加。因此我的问题是:如何动态构建我的函数func3然后传递( !)ONCE READY BUILT(!)函数func3到fsolve()???
非常感谢您提前
答案 0 :(得分:0)
解决方案:“将命令外包成字符串概念” 可以在函数外部构建一个字符串,如下所示:
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]是迭代的起始值!