绘制非线性方程解的对

时间:2019-09-09 20:07:49

标签: python numpy matplotlib

我尝试使用以下代码绘制对(x,y)的等式y ^ 2 + y = x ^ 3 + y(x ^ 2)的对图

import numpy as np
y = np.arange(0,12,.01)
x = np.arange(0,18,.01)
for i in enumerate(y):
    for j in enumerate(x):
        if (i**2)+i == j**3 + i*(j**2):
            plot(i,j)

但是,出现以下错误: “ TypeError:**或pow()不支持的操作数类型:'tuple'和'int'”

任何人都可以帮助我弄清楚如何绘制解决方案?

我还有另一个问题:是否可以将每个解决方案对存储在一个变量中,以便将来我们可以使用特定的解决方案对?

3 个答案:

答案 0 :(得分:2)

enumerate产生(index, value)元组,您可以使用拆包在循环头中分别获取每个元组:

for i_ind, i in enumerate(y):
    for j_ind, j in enumerate(x):

答案 1 :(得分:1)

另一个答案描述了停止抛出该异常所需的机械转换,但它不会在您的绘图中得到任何要点。 Numpy是一个数值库,而您想/需要解方程。

numpy.arange(0, 12, 0.01)生成一个有限系列数字,从0开始,以0.01递增,直到达到12。在上面给出一个方程,该方程主要被转换为Python代码,并根据这些有限的数字序列,并要求它绘制两个表达式求和为相同数字的值。 Python中的浮点数是64-bit floats,因此此等式被检查为大约15个十进制数字,对于您的数字基本上不会发生。

您不想使用您尝试做的事情,而是想使用类似Sympy的方法,这实际上会对您有所帮助。首先,我们开始:

from sympy import symbols, solveset, simplify, lambdify

x, y = symbols('x y')

eq1 = y**2 + y
eq2 = x**3 + x*y**2

ss = solveset(eq1 - eq2, y)

命名一对符号,将它们放入方程式中,并在eq1 == eq2时(相当于当它们的差为零时)放入solves

接下来要绘制这些解决方案,在这种情况下可以这样做:

import numpy as np
import matplotlib.pyplot as plt

xx = np.linspace(-5, 4, 101)
for eq in ss:
    fn = lambdify(x, eq)
    yy = fn(xx)
    # hide complex solutions
    yy[~np.isreal(yy)] = np.nan
    plt.plot(xx, np.real(yy), label=simplify(eq))

plt.legend()

这首先是引入numpy和matplotlib,然后在x轴上采样要评估函数的点,然后遍历解决方案,将其转换为Python函数,我们可以对其求值以获得数字答案,接下来我们求值在我们的采样点上,丢弃复杂的解决方案,然后绘制结果。

这给出了:

plot of solutions

x = -4.5周围的空白是由于此时采样稀疏所致。我们可以通过评估x=-4.5, y=10上的方程来进行检查,两个方程都得到〜110

答案 2 :(得分:1)

我建议您修改配方并绘制LHS和RHS之间的平方差:

x = np.linspace(-1, 1, 100)
y = np.linspace(-1, 1, 100)
X, Y = np.meshgrid(x, y)

def F(p):
    x, y = p
    v = y**2 + y - x**3 - y * (x**2)
    return v**2

Z = F((X, Y))
plt.contourf(X, Y, Z)
plt.colorbar()
idx = np.where(np.abs(Z) < 1e-4)
plt.scatter(X[idx], Y[idx], marker='+', color='w')

enter image description here

您还可以使用scipy.optimize.fmin(F, [1, 1])来获得F=0的精确解,其中[1, 1]是您的最初猜测。在这种情况下,不同的初始猜测将导致不同的解决方案。