我试图找到以下系统的解决方案,其中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]])
其他模块的建议,如同情,也欢迎!
发布于 2022-04-17 17:50:42
首先,我建议使用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
你所拥有的应该是正确的,所以我相信你使用的方程式有问题。如果你提供这些,我可以试着看看可能出了什么问题。
发布于 2022-04-17 18:16:19
这似乎更像是一个数值数学问题,而不是Python编码问题。你的函数可能在解的周围有“丑陋”的行为,可能是强非线性的,或者包含奇点。我们无法在没有看到功能的情况下作出进一步的贡献。你可以尝试的一件事是解决一个系统
g(f(x)) -x=0
并尽可能地简化g(f(x))。求解方程后,计算y= f(x)。
https://stackoverflow.com/questions/71903787
复制相似问题