python - [源于一个简单的错字的胡说八道]
问题描述
我的困惑只是基于我的代码中的一个错字——这里没有什么有趣的东西可以学习! 我只是绘制了错误的函数,请参阅我对已接受答案的评论。
下面是一些看似无害的 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()
及其输出:
绘制的轮廓线是错误的!我正在做二次函数的等高线图,等高线应该是椭圆。显示的线条不仅仅是看似线条,在更大的范围内会变成椭圆。我至少有两个理由这么说:
这是相同函数在相似比例下的Wolfram Alpha 等值线图。它显示了应该存在的省略号。
我手工计算了相应的对角二次形式(根据主轴定理):它是,稍微四舍五入,
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
,会产生一个非常好的省略号:
我的问题:
- 他的行为有什么解释?
- 我该怎么做才能获得第一个函数的准确等高线图?
解决方案
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) 显然,等高线图因a
in不同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()
样本输出:
推荐阅读
- ios - 自动调整导航项标题字体大小以适应
- python - 如何在python中用'\\'替换带有'\'的字符串
- html - 反应:样式 css 有效不允许焦点
- kubernetes - 在使用“服务拓扑”托管 PODS 的情况下,自动缩放将如何工作?
- database - Oracle PL/SQL 条件声明?
- python - 使用python进行网页抓取以打印类div
- python - 是否可以从带类型注释的类中生成用于测试的对象?
- javascript - 多个同名查询参数
- javascript - 计算在一个数组中找到但在另一个数组中没有的 Moment.js 范围数组
- pandas - 在 PySpark 中使用 pandas_udf 时无法填充数组