【问题标题】:Is fsolve good to any system of equations?fsolve 对任何方程组都有用吗?
【发布时间】:2025-12-29 08:35:06
【问题描述】:

我没有太多使用 Python 的经验,但我决定尝试解决以下方程组:

x = A * exp (x+y)

y = 4 * exp (x+y)

我想解决这个系统并将 x 和 y 绘制为 A 的函数。

我看到了一些类似的question 并尝试使用 fsolve:

`from scipy.optimize import fsolve
 def f(p):
   x, y = p
   A = np.linspace(0,4)
   eq1= x -A* np.exp(x+y)
   eq2= y- 4* np.exp(x+y)
   return (eq1,eq2)
 x,y =  fsolve(f,(0, 0))
 print(x,y)
 plt.plot(x,A)
 plt.plot(y,A)
`

我收到以下错误: setting an array element with a sequence. Result from function call is not a proper array of floats.

【问题讨论】:

  • 您尚未在显示的代码中定义A。如果您提供minimal, complete and verifiable example,别人会更容易帮助您。
  • 刚刚编辑过,正如我所说,我对 Python 的经验很少,也许我定义 A 的方式不正确,但我希望 A 在 0 到 4 之间变化

标签: python scipy


【解决方案1】:

将 A 的值作为参数传递给函数,并分别为 A 的每个值运行 fsolve。 以下代码有效。

from scipy.optimize import fsolve
import matplotlib.pyplot as plt
import numpy as np
def f(p,*args):
  x, y = p
  A = args[0] 

  return (x -A* np.exp(x+y),y- 4* np.exp(x+y))
A = np.linspace(0,4,5)
X = []
Y =[]
for a in A:
  x,y =  fsolve(f,(0.0, 0.0) , args=(a))
  X.append(x)
  Y.append(y)
  print(x,y)

plt.plot(A,X)
plt.plot(A,Y)

4.458297786441408e-17 -1.3860676807976662
-1.100088440495758 -0.5021704548996653
-1.0668987418054918 -0.7236105952221454
-1.0405000943788385 -0.9052366768954621
-1.0393471472966025 -1.0393471472966027
/usr/local/lib/python3.6/dist-packages/scipy/optimize/minpack.py:163: RuntimeWarning: The iteration is not making good progress, as measured by the 
  improvement from the last ten iterations.
  warnings.warn(msg, RuntimeWarning)
/usr/local/lib/python3.6/dist-packages/scipy/optimize/minpack.py:163: RuntimeWarning: The iteration is not making good progress, as measured by the 
  improvement from the last five Jacobian evaluations.
  warnings.warn(msg, RuntimeWarning)
[<matplotlib.lines.Line2D at 0x7f4a2a83a4e0>]

【讨论】:

  • 效果很好!我在这里读到*.com/questions/6519380/… brenqtfsolve 快得多。我尝试过使用它,但不断收到f(a) and f(b) must have different signs。我知道f must be continuous. f(a) and f(b) must have opposite signs. 但在实际情况下,我的功能太复杂了,无法事先知道它们的迹象。在这种情况下可以使用brentq吗?
  • 不,你不能。 brentq 旨在找到方程的根,而不是求解方程组。 ab 指的是同一根的区间。它们必须是标量。在您的情况下,您希望同时解决xy。但是,您可能想尝试scipy.optimize.root,它适用于多变量情况。