繁体   English   中英

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

[英]Python & fsolve(): dynamical content of a function f(x) that is called by fsolve()

让我们说我有一个方程式

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]。 但是我的程序将处理几百到数千行的线性方程组。 这意味着,在每个迭代步骤中,所有这些排行都将附加,如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,然后将(!)一次构建(!)函数func3传递给fsolve()?

提前非常感谢你

解决方案:“将命令外包到字符串中”可以在函数外部构建字符串,如下所示:

StringCommand = "f = [2*x[0] + 4*x[1], 18*x[1] - 18]"

之后,此StringCommand用作要调用的函数的输入参数,如下所示:

def func(x,StringCommand):
  exec StringCommand
  return f  

因此,通过命令exec执行StringCommand。 最后,只需在fsolve()中调用函数,如下所示:

fsolve(func, [1, 1], StringCommand)

而已。 这样,StringCommand便在func()函数外部构建一次,因此当fsolve()使用函数func()进行迭代时,可以节省很多时间。 注意[1,1]是迭代的起始值!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM