สวัสดีปัญหา:
R คือขอบเขตในระนาบ xy ที่ล้อมรอบด้วยพาราโบลา y=x^2+1 และเส้นตรง y=x+3 ของแข็งแห่งการปฏิวัติเกิดจากการหมุน R รอบแกน x ฉันต้องพล็อตพาราโบลาและเส้นในแบบ 2 มิติ และการปฏิวัติแบบทึบ 3 มิติ ทำอย่างไร ฉันติดตั้งอนาคอนด้าแล้ว
สวัสดีปัญหา:
R คือขอบเขตในระนาบ xy ที่ล้อมรอบด้วยพาราโบลา y=x^2+1 และเส้นตรง y=x+3 ของแข็งแห่งการปฏิวัติเกิดจากการหมุน R รอบแกน x ฉันต้องพล็อตพาราโบลาและเส้นในแบบ 2 มิติ และการปฏิวัติแบบทึบ 3 มิติ ทำอย่างไร ฉันติดตั้งอนาคอนด้าแล้ว
คุณสามารถใช้ plot_surface
:
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
u = np.linspace(-1, 2, 60)
v = np.linspace(0, 2*np.pi, 60)
U, V = np.meshgrid(u, v)
X = U
Y1 = (U**2 + 1)*np.cos(V)
Z1 = (U**2 + 1)*np.sin(V)
Y2 = (U + 3)*np.cos(V)
Z2 = (U + 3)*np.sin(V)
ax.plot_surface(X, Y1, Z1, alpha=0.3, color='red', rstride=6, cstride=12)
ax.plot_surface(X, Y2, Z2, alpha=0.3, color='blue', rstride=6, cstride=12)
plt.show()
หากต้องการพล็อตพื้นผิวโดยใช้ plot_surface
คุณต้องเริ่มต้นด้วยการระบุพารามิเตอร์ 1 มิติสองตัว ได้แก่ u
และ v
:
u = np.linspace(-1, 2, 60)
v = np.linspace(0, 2*np.pi, 60)
โดยที่ x
, y
, z
เป็นฟังก์ชันของพารามิเตอร์ u
และ v
:
x = x(u, v)
y = y(u, v)
z = z(u, v)
สิ่งที่ควรสังเกตเกี่ยวกับ ax.plot_surface
คืออาร์กิวเมนต์สามตัวแรกต้องเป็นอาร์เรย์ 2 มิติ ดังนั้นเราจึงใช้ np.meshgrid
เพื่อสร้างเมทริกซ์พิกัด (U
และ V
) จากเวกเตอร์พิกัด (u
และ v
) และกำหนดอาร์เรย์ 2 มิติ X
, Y
, Z
ให้เป็นฟังก์ชันของ U
และ V
:
X = U
Y1 = (U**2 + 1)*np.cos(V)
Z1 = (U**2 + 1)*np.sin(V)
สำหรับแต่ละตำแหน่งบนเมทริกซ์พิกัด U
และ V
จะมีค่าที่สอดคล้องกันสำหรับ X
และ Y
และ Z
ซึ่งจะสร้างแผนที่จาก uv
-space 2 มิติ ถึง xyz
-space 3 มิติ สำหรับทุกสี่เหลี่ยมใน uv
-space จะมีใบหน้าอยู่บนพื้นผิวของเราใน xyz
-space พื้นผิวโค้งที่วาดโดย plot_surface
ประกอบด้วยพื้นผิวเรียบเหล่านี้
ax.plot_surface(X, Y1, Z1,...)
เป็น ax.plot_surface(Y1, X, Z1,...)
และทำเช่นเดียวกันสำหรับการเรียก ax.plot_surface
ครั้งที่สอง เอาล่ะ พื้นผิวของการปฏิวัติตอนนี้จะอยู่รอบแกน y แน่นอนว่า X
กำลังมีบทบาทเป็น y และ Y1
และ Y2
ก็เป็นค่า x ดังนั้นเพื่อความชัดเจน คุณยังคงต้องการเปลี่ยนชื่อตัวแปรด้วย แต่ผลลัพธ์สามารถทำได้โดยการสลับตัวแปร X
และ Y
- person unutbu; 23.04.2017
Y1
และ X
จะทำให้พื้นที่และรูปร่างเท่ากัน
- person haccks; 23.04.2017
x
เป็นฟังก์ชันของ y
เมื่อสลับ X
และ Y1
แล้ว X
จะสามารถแสดงเป็นฟังก์ชันของ U
(ซึ่งเหมือนกับ Y1
) และ V
ดังนั้น แทนที่จะเป็น Y1 = (U**2 + 1)*np.cos(V)
คุณจะมี X = (...)*np.cos(V)
โดยที่ (...)
มาจากนิพจน์ของคุณสำหรับ x
เป็นฟังก์ชันของ y
- person unutbu; 23.04.2017
x
เป็นฟังก์ชันของ y
จากนั้นแทนที่ U
ด้วย y
ใช้สิ่งนั้นแทน (...)
ใน X = (...)*np.cos(V)
- person unutbu; 24.04.2017
y = x**2
, y = 3*x + 5
แต่สำหรับฟังก์ชันเช่น y = x**3 + x**2
มันจะไม่ทำงาน คุณไม่สามารถหาค่าผกผันของพหุนามนี้ (AFAIK) ได้
- person haccks; 24.04.2017
จากด้านบน คุณสามารถทำให้สิ่งเหล่านี้มีชีวิตชีวาด้วยวิดเจ็ตหรือ GIF
สร้าง GIF: ใช้แพ็คเกจ GIF:
import gif
@gif.frame
def plot_volume(angle):
fig = plt.figure(figsize = (20, 15))
ax2 = fig.add_subplot(1, 1, 1, projection = '3d')
angles = np.linspace(0, 360, 20)
x = np.linspace(-1, 2, 60)
v = np.linspace(0, 2*angle, 60)
U, V = np.meshgrid(x, v)
Y1 = (U**2 + 1)*np.cos(V)
Z1 = (U**2 + 1)*np.sin(V)
Y2 = (U + 3)*np.cos(V)
Z2 = (U + 3)*np.sin(V)
X = U
ax2.plot_surface(X, Y1, Z1, alpha = 0.2, color = 'blue', rstride = 6, cstride = 6)
ax2.plot_surface(X, Y2, Z2, alpha = 0.2, color = 'red', rstride = 6, cstride = 6)
ax2.set_xlim(-3,3)
ax2.set_ylim(-5,5)
ax2.set_zlim(-5,5)
ax2.view_init(elev = 50, azim = 30*angle)
ax2.plot_wireframe(X, Y2, Z2)
ax2.plot_wireframe(X, Y1, Z1, color = 'black')
ax2._axis3don = False
frames = []
for i in np.linspace(0, 2*np.pi, 20):
frame = plot_volume(i)
frames.append(frame)
gif.save(frames, 'images/vol1.gif', duration = 500)
from IPython.display import Image
Image('images/vol1.gif')
ทำให้เป็นแบบโต้ตอบ: ใช้ ipywidgets
def three_d_plotter(angle, rotate, turn):
fig = plt.figure(figsize = (13, 6))
ax = fig.add_subplot(1, 1, 1, projection='3d')
u = np.linspace(-1, 2, 60)
v = np.linspace(0, angle, 60)
U, V = np.meshgrid(u, v)
X = U
Y1 = (U**2 + 1)*np.cos(V)
Z1 = (U**2 + 1)*np.sin(V)
Y2 = (U + 3)*np.cos(V)
Z2 = (U + 3)*np.sin(V)
ax.plot_surface(X, Y1, Z1, alpha=0.3, color='red', rstride=6, cstride=12)
ax.plot_surface(X, Y2, Z2, alpha=0.3, color='blue', rstride=6, cstride=12)
ax.plot_wireframe(X, Y2, Z2, alpha=0.3, color='blue', rstride=6, cstride=12)
ax._axis3don = False
ax.view_init(elev = rotate, azim = turn)
plt.show()
from ipywidgets import interact
import ipywidgets as widgets
interact(three_d_plotter, angle = widgets.FloatSlider(0, min = 0, max = 2*np.pi, step = np.pi/10),
rotate = widgets.FloatSlider(0, min = 0, max = 360, step = 5),
turn = widgets.FloatSlider(0, min = 0, max = 500, step = 5))