使用scipy fsolve查找方程组的多个根时遇到困难

5fjcxozz  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(181)

具有如下两个耦合方程的系统:

two_exponential = lambda x, kernel, c: np.array([x[0] - np.exp(kernel[0] * x[0] + kernel[2] * x[1] + c), x[1] - np.exp(kernel[1] * x[1] + kernel[3] * x[0] + c)])

我想找到两条线与scipy.fsolve的交点,我这样做的方法是找到这个系统在不同b11,b22, b12, b21配置下的根。

b = np.array([b11, b22, b12, b21])
x_min_plot = -10
x_max_plot = 35
x_1 = np.linspace(x_min_plot, x_max_plot, 100)
x_2 = np.linspace(x_min_plot, x_max_plot, 100)
x_1, x_2 = np.meshgrid(x_1, x_2)
z_1 = -x_1 + np.exp(b[0] * x_1 + b[2] * x_2 + c)
z_2 = -x_2 + np.exp(b[1] * x_2 + b[3] * x_1 + c)
x_sols = []
x_min = 0
x_max = 35

for x in np.arange(x_min, x_max, 5):
    for y in np.arange(x_min, x_max, 5):
        initial = np.array([x, y])
        x_sol = fsolve(two_exponential, initial, args=(b, c), full_output=1)
        if x_sol[2] == 1: # if the solution converged
            x_sols.append(np.round(x_sol[0], 2))

# [x for i, x in enumerate(x_sols) if not np.isclose(x, x_sols[i-1], atol = 1e-1).all()]

x_sols = np.unique(x_sols, axis=0)

print(f'z*: {np.round(x_sols, 2)}')
if x_sol[2] != 1:
    print('no solution')

我还对解决方案进行了四舍五入,忽略了重复的根,因为我只想找到唯一的根。代码似乎在某些情况下工作正常:

但不适用于其他一些条件:

你知道这样的问题是从哪里出现的吗?

pgky5nke

pgky5nke1#

感谢所有的评论。我用一个简单的技巧解决了这个问题。因为fsolve方法是求系统的根,所以把解输入回函数应该会得到零。我添加了另一个if语句,检查解是否真的得到零,并只接受那些解。

if x_sol[2] == 1: # if the solution converged
   if np.isclose(two_exponential(x_sol[0], b, c), 0, atol = 1e-3).all():

这就解决了问题。我需要指出的是,问题仍然存在,我不知道为什么fsolve会这样做。我在fsolve中更改了“xtol
但这也帮不上什么忙。不管怎样,现在问题是通过检查根是否真的是根来解决的!

相关问题