用 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 。

 

posted on 2024-02-10 03:00  Mira_2019  阅读(49)  评论(0编辑  收藏  举报