Python& fsolve():由fsolve()调用的函数f(x)的动态内容

时间:2013-02-15 20:22:10

标签: python

让我们说我有一个等式

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()???

非常感谢您提前

1 个答案:

答案 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]是迭代的起始值!