首页 > 解决方案 > [源于一个简单的错字的胡说八道]

问题描述

我的困惑只是基于我的代码中的一个错字——这里没有什么有趣的东西可以学习! 我只是绘制了错误的函数,请参阅我对已接受答案的评论。

下面是一些看似无害的 Python 代码

import matplotlib.pyplot as plt 
import numpy as np 
  
delta = 0.02    
    
x = np.arange(-10, 10, delta) 
y = np.arange(-10, 10, delta) 
[X, Y] = np.meshgrid(x, y) 
  
fig, ax = plt.subplots() 
  
Z = X**2+2*X*Y+Y**2
# for comparison later use this:
#Z = 3.14*X**2+0.6*Y**2 
  
ax.contour(X, Y, Z)   
ax.set_xlabel('x') 
ax.set_ylabel('y') 
  
plt.show() 

及其输出:

在此处输入图像描述

绘制的轮廓线是错误的!我正在做二次函数的等高线图,等高线应该是椭圆。显示的线条不仅仅是看似线条,在更大的范围内会变成椭圆。我至少有两个理由这么说:

  1. 这是相同函数在相似比例下的Wolfram Alpha 等值线图。它显示了应该存在的省略号。

  2. 我手工计算了相应的对角二次形式(根据主轴定理):它是,稍微四舍五入,Z = 3.14*X**2+0.6*Y**2

这是一个函数,它首先将给定向量旋转(X,Y)一定角度,然后应用Z = X**2+2*X*Y+Y**2代码中使用的函数。因此,这两个函数的等高线图应该只是旋转不同。

但是Z = 3.14*X**2+0.6*Y**2在上面的代码中插入,代替前面的Z,会产生一个非常好的省略号:

在此处输入图像描述

我的问题:

  1. 他的行为有什么解释?
  2. 我该怎么做才能获得第一个函数的准确等高线图?

标签: pythonmatplotlibquadratic

解决方案


matplotlib 等高线图是正确的。

A)我们可以看一下3D投影:

from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,10))
ax = fig.gca(projection='3d')

delta = 2  
    
x = np.arange(-100, 100, delta) 
y = np.arange(-100, 100, delta) 
X, Y = np.meshgrid(x, y)   
  
Z = X**2 + Y**2 + 2*X*Y
ax.plot_surface(X, Y, Z)

plt.show()

样本输出:

在此处输入图像描述

是的,平行于 的线x = -y

B) 让我们看一下 的数学表示x+y=a,即y=a-x

然后如下:
z = x² + y² + 2xy
= x² + (ax)² + 2x(ax)
= x² + a² - 2ax + x² + 2ax - 2x²
= a²

这就是我们在曲面图和等高线图中看到的 - 对于平行于 的线x=-y, -z值独立于x(或y) 并且仅取决于a(并且对于正值和负值是对称的a)。

C) 显然,等高线图因ain不同x²+2xy+ay²(如您所料)。但是因为我们可以,让我们添加这个小例子:

import matplotlib.pyplot as plt 
import numpy as np 
  
delta = 0.02  
    
x = np.arange(-10, 10, delta) 
y = np.arange(-10, 10, delta) 
X, Y = np.meshgrid(x, y) 
  
fig, axes = plt.subplots(3, 3, figsize=(10,10)) 
  
Z = X**2 + Y**2 + 3*Y*X
# for comparison later use this:
#Z = 3.14*X**2+0.6*Y**2 

for i, ax in enumerate(axes.flatten()):
    a=i-2
    Z = X**2 + a* Y**2 + 2*X*Y
    cs = ax.contour(X, Y, Z)
    ax.clabel(cs, inline=True, fontsize=10)
    ax.set_title("x²+2xy+ay² for a="+str(a))
  
plt.tight_layout()
plt.show() 

样本输出:

在此处输入图像描述


推荐阅读