【问题标题】:Solution to a system of non-linear equations in R^2R^2 中非线性方程组的解
【发布时间】:2022-07-13 03:20:22
【问题描述】:

我正在尝试找到以下系统的解决方案,其中 f 和 g 是 R^2 -> R^2 函数:

f(x1,x2) = (y1,y2)
g(y1,y2) = (x1,x2)

我尝试使用 scipy.optimize.fsolve 解决它,如下所示:

def eqm(vars):
    x1,x2,y1,y2 = vars
    eq1 = f([x1, x2])[0] - y1
    eq2 = f([x1, x2])[1] - y2
    eq3 = g([y1, y2])[0] - x1
    eq4 = g([y1, y2])[1] - x2
    return [eq1, eq2, eq3, eq4]

fsolve(eqm, x0 = [1,0.5,1,0.5])

虽然它正在返回一个输出,但它似乎不是一个正确的输出,因为它似乎不满足这两个条件,并且似乎与指定的 x0 变化很大。还收到警告: “根据过去十次迭代的改进来衡量,迭代没有取得良好的进展。”我确实知道存在一个独特的解决方案,这是我通过代数获得的。

不确定发生了什么,以及是否有更简单的解决方法,尤其是仅使用两个方程而不是分成 4 个方程。类似:



def equations(vars):
    X,Y = vars
    eq1 = f(X)-Y
    eq2 = g(Y)-X
    return [eq1, eq2]

fsolve(equations, x0 =[[1,0.5],[1,0.5]])

对其他模块的建议,例如也欢迎同情!

【问题讨论】:

  • 欢迎来到 SO。您能否提供fg 以便您的问题包含minimal reproducible example
  • 谢谢,我已经添加了。但恐怕不是太“小”

标签: python numpy scipy sympy equation-solving


【解决方案1】:

首先,我建议使用 numpy 数组,因为操作这些数组比列表更简单。

我稍微重写了你的代码:

import scipy.optimize as opt

def f(x):
  return x
def g(x):
  return x

def func(vars):
  input = np.array(vars)
  eq1 = f(input[:2]) - input[2:]
  eq2 = g(input[2:]) - input[:2]
  return np.concatenate([eq1, eq2])

root = opt.fsolve(func, [1, 1, 0., 1.2])

print(root)
print(func(root)) # should be close to zeros

您所拥有的应该可以正常工作,所以我认为您使用的方程式有问题。如果您提供这些,我可以尝试看看可能有什么问题。

【讨论】:

  • 感谢您的评论。我已编辑以包含方程式。方程本身是从两个优化问题推导出来的。此外,尝试考虑一种不同的优化方法是否会产生更好的结果。
【解决方案2】:

这似乎更像是一个数值数学问题,而不是 Python 编码问题。您的函数在解决方案周围可能有“丑陋”的行为,可能是强烈的非线性或包含奇点。如果没有看到这些功能,我们将无法提供进一步的帮助。您可能会尝试的一件事是解决系统问题

g(f(x)) - x = 0

并尽可能在解析上简化 g(f(x))。然后解方程后计算y = f(x)。

【讨论】:

  • 感谢您的评论。我在上次编辑中包含了特定功能。这些函数基本上是两个优化问题的结果。您认为正在使用的优化方法可能会导致潜在的“丑陋”行为吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多