0

假设我有一个方程

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]。但我的程序将处理数百到数千行的线性方程组。这意味着在每个迭代步骤中,所有这些 thounds 行都被附加,如 func2(x) 所示。因此,我正在寻找一种解决方案,即 ONCE 将方程组创建为函数 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 然后将(!)ONCE READY BUILT(!)函数 func3 传递给 fsolve() ???

非常感谢您提前

4

1 回答 1

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

于 2013-02-19T08:48:25.743 回答