[英]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.