首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python & fsolve():由fsolve()调用的函数f(x)的动态内容

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

Stack Overflow用户
提问于 2013-02-16 04:22:10
回答 1查看 950关注 0票数 0

假设我有一个等式

代码语言:javascript
复制
x + 2*cos(x) = 0

我想解决这个问题。然后我可以编写以下代码:

代码语言:javascript
复制
def func1(x):  
  out = x + 2*cos(x)
  return out
Solution = fsolve(func1, StartValue)

在本例中,StartValue可以有一个任意值。到目前一切尚好!我正在编写一个模拟程序,它创建了一个非线性方程系统,我想用fsolve()来求解它。现在的挑战是(!)在运行时间之前,非线性方程组的大小是未知的(!)。例如,这意味着我可以拥有

X+ 2*cos(x) =0

就像我能拥有的一样

代码语言:javascript
复制
2*x + 4*y = 0
18*y -18 = 0

为了求解最后提到的方程组(在我的程序中通常是非线性的),我找到了以下解决方案:

代码语言:javascript
复制
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),直到找到解为止。但我的程序将处理数百行的线性方程组。这意味着在每个迭代步骤中,所有这些thousend行都会被追加,如func2(x)中所示。因此,我正在寻找一种解决方案,一旦将方程系统创建为函数func3(x),然后fsolve()只调用现成的func3(x)。下面是一个伪代码示例:

代码语言:javascript
复制
func3 = lambda x: 2*x[0] + 4*x[1]
func3.append(lambda x: 18*x[1] - 18)
Solution = fsolve(func3, [1, 1])

不幸的是,函数不能被附加,正如我在上面的伪代码中所展示的。因此,我的问题是:如何动态构建函数func3,然后传递( !)一旦准备好构建(!)函数func3 to fsolve()?

非常感谢你提前

EN

回答 1

Stack Overflow用户

发布于 2013-02-19 16:48:26

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

代码语言:javascript
复制
StringCommand = "f = [2*x[0] + 4*x[1], 18*x[1] - 18]"

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

代码语言:javascript
复制
def func(x,StringCommand):
  exec StringCommand
  return f  

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

代码语言:javascript
复制
fsolve(func, [1, 1], StringCommand)

就这样。通过这种方式,StringCommand在函数func()外部构建一次,因此当fsolve()使用函数func()进行迭代时,可以节省大量时间。请注意,1,1是迭代的起始值!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14902730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档