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

0 投票
1 回答
1142 浏览
提问于 2025-04-17 16:02

假设我有一个方程

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)中那样被添加进去。因此,我在寻找一个解决方案,能够一次性创建方程组作为一个函数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,然后将(!)一次性构建好的(!)函数func3传递给fsolve()呢???

非常感谢!

1 个回答

0

解决方案:“把命令放到一个字符串拼接里”

我们可以在函数外部构建一个字符串,方法如下:

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

然后,这个字符串命令会作为输入参数传递给要调用的函数,方法如下:

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

这样,字符串命令就可以通过命令 exec 来执行。最后,只需要在 fsolve() 中调用这个函数,方法如下:

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

就这样。通过这种方式,字符串命令只在 func() 函数外部构建一次,因此在 fsolve() 进行 func() 函数的迭代时,可以节省很多时间。请注意,[1,1] 是迭代的起始值!

撰写回答