用 python 比较 椭球体、单叶双曲面、双叶双曲面
2024年2月10日
昨天晚上年夜饭,也算是道出这几年的麻烦 —— 就是内心戏多,加上身边又没有太多的案例(或者更多人)让我的认知有个比较客观的校准。现在就学习吧。
尝试用 Python 画出椭球体、单叶双曲面、双叶双曲面。
1. 椭球面
代码
# ---- Test ----- # 椭球, 单叶双曲面, 双叶双曲面 import numpy as np import pandas as pd from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt from matplotlib import cm import numpy as np fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # -------------------- # ---- Start Here ---- # -------------------- a,b,c= 1, 1, -1 u = np.linspace(-np.pi, np.pi, 100) v = np.linspace(0, np.pi, 100) # 椭球面 x = a * np.outer(np.cos(u), np.sin(v)) y = b * np.outer(np.sin(u), np.sin(v)) z = c * np.outer(np.ones(np.size(u)), np.cos(v)) ax.plot_surface(x, y, z, cmap=cm.coolwarm) plt.show()
2.单叶双曲面
3.双叶双曲面
2024年2 月10日上午 6:12分
终于有点像了,我稍微调整一下图象弯曲的方向。
2024 年 2 月 10 下午10:23
终于搞懂了 meshgrid 啦!争取这次别忘记!
2024 年 2 月 11 日 5:44 AM
一步一步学! 看 np,outer()
在不看源代码的情况下,要测试出函数的作用,还是比较有难度。但是据说,你要是微积分学得还可以,可以做到。然后嘛
果然学得不咋地。
在经历了《算你狠》、《大城小爱》、《龙的传人》,我作出图像啦!
实在是太简单了 —— 得来全不费功夫就是如此。
代码
a,b,c= 2, 2, 2 u = np.linspace(-np.pi, np.pi, 10) v = np.linspace(0, np.pi, 10)
# 单叶双曲面
# -- 根据自己推导的公式
x1 = a * np.outer( np.cos(u), 1/np.cos(v) ) # 形同 meshgrid
y1 = b * np.outer( np.sin(u), 1/np.cos(v) )
z1 = c * np.outer( np.ones(len_z), 1*np.sin(v) )
z2=-1*z1
z3=np.vstack((z1, z2))
# Plot the surface
ax.plot_surface( x1, y1, z1, cmap=cm.coolwarm)
ax.plot_surface( x1, y1, z2, cmap=cm.coolwarm)
plt.show()
最关键,之前还想着平移图像来着,原来只要画两张图,拼一块就行了……
有时候,是真想多了!
8:13 AM 坦率地说,最近很多东西都干得很 Bullshit! 学习也不好! 太不爽了! 我打算补补觉,放个假。
Um, 我自己脑袋里的图像,应该是这种的。但是也没那么多自信。代码先贴上,具体做法,就是从 x-y-z 做坐标系转换。例如, 椭圆都是用球体坐标。双曲线的话,绕着啥轴都用柱面坐标比较容易。
然后你就开始推导公式。
代码
fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # --- Param a,b,c= 2, 2, 2 u = np.linspace(-0.4*np.pi, 0.4*np.pi, 50) v = np.linspace(-0.4*np.pi, 0.4*np.pi, 50) # -------- 根据自己推导的公式 --------- x4 = a * np.outer(np.cos(u), np.tan(v/1)) y4 = b * np.outer(np.sin(u), np.tan(v/1)) z4 = c * np.outer(np.ones(np.size(u)), 1/np.cos(u)) z5=-z4 ax.plot_surface( x4, y4, z4, cmap=cm.coolwarm) ax.plot_surface( x4, y4, z5, cmap=cm.coolwarm) plt.show()
其实我还是留有不少疑惑。
这是我的参考资料:http://staff.ustc.edu.cn/~rui/ppt/calculus/geo_3.html
中科大的这个资料还是比较准的。遗留问题:
1. 除了椭球面之外,其他两个双曲面都用的柱面坐标。我其实对于第二个角度 phy 还是有很多地方没理解。
2. 画图的思路,如果有代码就找代码,没有代码,自己按照应该有的情况。如果符合则拿来用,不符合再找找看别人处理这类问题。如果完全自己独立思考的话,就是落实到符合自己认为该有的样子。
2024 年 2月 12 日 年初三
我想了半天,还是觉得不靠谱。
又推了一遍 :
我的水平暂时已经这样 TOP 了
然后我测试了这个参数方程。其中 v 就是 phy,通常是从和 z 轴正向夹角开始,取值 0-Pi
实验控制的变量是角度: u - 平行于 xOy 平面内的 theta。v - phy 如上述。
分别取值 5, 8, 10, 16 。效果如图
下午 7:19
哇塞,首次在杭州过年,大新年的太阳可好!
接下来看双叶双曲面。我这里没搜到 plot_surface 的代码。因此,在 Z 轴这个维度,就简单粗暴地使用表达式了。
其实是这样的,如果你用球体坐标,例如,球体 x = cos(u)*sin(v), y = sin(u)*sin(v), z = cos(v) 可以直接在坐标系中体现。但是呢,双叶双曲面,我自己推导了一下,实在不知道 z 用什么,于是就简单粗暴地使用解析表达式,然后!就画出来了!
其实这事情很简单,真的,只需要知道解析表达式!至于你 xOy 平面(包括平行的平面族)要怎么表示,都是无差的。
我的推导过程
代码 + 图像
为了显示它是个双曲面,来个近景。
至此,这样应该是对三个曲面足够了解了!关键,作图的话,还要对函数本身有所理解。
希望大家关注 ShoelessCai.com 。