具有如下两个耦合方程的系统:
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')
我还对解决方案进行了四舍五入,忽略了重复的根,因为我只想找到唯一的根。代码似乎在某些情况下工作正常:
但不适用于其他一些条件:
你知道这样的问题是从哪里出现的吗?
1条答案
按热度按时间pgky5nke1#
感谢所有的评论。我用一个简单的技巧解决了这个问题。因为fsolve方法是求系统的根,所以把解输入回函数应该会得到零。我添加了另一个if语句,检查解是否真的得到零,并只接受那些解。
这就解决了问题。我需要指出的是,问题仍然存在,我不知道为什么fsolve会这样做。我在fsolve中更改了“xtol
但这也帮不上什么忙。不管怎样,现在问题是通过检查根是否真的是根来解决的!