我尝试使用以下代码绘制对(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'”
任何人都可以帮助我弄清楚如何绘制解决方案?
我还有另一个问题:是否可以将每个解决方案对存储在一个变量中,以便将来我们可以使用特定的解决方案对?
答案 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函数,我们可以对其求值以获得数字答案,接下来我们求值在我们的采样点上,丢弃复杂的解决方案,然后绘制结果。
这给出了:
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')
您还可以使用scipy.optimize.fmin(F, [1, 1])
来获得F=0
的精确解,其中[1, 1]
是您的最初猜测。在这种情况下,不同的初始猜测将导致不同的解决方案。