การวางแผนการปฏิวัติที่มั่นคงใน Python 3 (อาจเป็น matplotlib)

สวัสดีปัญหา:

R คือขอบเขตในระนาบ xy ที่ล้อมรอบด้วยพาราโบลา y=x^2+1 และเส้นตรง y=x+3 ของแข็งแห่งการปฏิวัติเกิดจากการหมุน R รอบแกน x ฉันต้องพล็อตพาราโบลาและเส้นในแบบ 2 มิติ และการปฏิวัติแบบทึบ 3 มิติ ทำอย่างไร ฉันติดตั้งอนาคอนด้าแล้ว


person Robby    schedule 07.04.2016    source แหล่งที่มา
comment
ดูเหมือนว่าคุณต้องการให้เราเขียนโค้ดให้คุณ แม้ว่าผู้ใช้จำนวนมากยินดีที่จะสร้างโค้ดสำหรับผู้เขียนโค้ดที่กำลังประสบปัญหา แต่โดยปกติแล้วพวกเขาจะช่วยเหลือได้ก็ต่อเมื่อผู้โพสต์ได้พยายามแก้ไขปัญหาด้วยตนเองแล้วเท่านั้น วิธีที่ดีในการแสดงให้เห็นถึงความพยายามนี้คือการรวมโค้ดที่คุณเขียนไว้ ตัวอย่างอินพุต (ถ้ามี) ผลลัพธ์ที่คาดหวัง และเอาต์พุตที่คุณได้รับจริง (เอาต์พุตคอนโซล การย้อนกลับ ฯลฯ) ยิ่งคุณให้รายละเอียดมากเท่าไร คุณก็ยิ่งมีโอกาสได้รับคำตอบมากขึ้นเท่านั้น ตรวจสอบคำถามที่พบบ่อยและวิธีถาม< /ก>.   -  person idjaw    schedule 07.04.2016


คำตอบ (2)


คุณสามารถใช้ 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 ประกอบด้วยพื้นผิวเรียบเหล่านี้

person unutbu    schedule 07.04.2016
comment
คำตอบของคุณคือสำหรับแกน x คุณช่วยฉันหาจุดแข็งของการปฏิวัติรอบแกน y ได้ไหม - person haccks; 23.04.2017
comment
@haccks: ใช้โค้ดด้านบน เพียงเปลี่ยน 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
comment
ฉันลองแล้ว แต่ก็ไม่มีโชค การหมุนตามแกนที่ต่างกันจะให้พื้นที่และรูปร่างที่แตกต่างกัน การสลับ Y1 และ X จะทำให้พื้นที่และรูปร่างเท่ากัน - person haccks; 23.04.2017
comment
มันควรจะเป็นนี่ - person haccks; 23.04.2017
comment
คุณต้องแก้หา 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
comment
คุณหมายถึงฟังก์ชันผกผันใช่ไหม? - person haccks; 23.04.2017
comment
ใช่. ค้นหาฟังก์ชันผกผันที่แสดง x เป็นฟังก์ชันของ y จากนั้นแทนที่ U ด้วย y ใช้สิ่งนั้นแทน (...) ใน X = (...)*np.cos(V) - person unutbu; 24.04.2017
comment
ใช่. ใช้งานได้กับฟังก์ชันเช่น y = x**2, y = 3*x + 5 แต่สำหรับฟังก์ชันเช่น y = x**3 + x**2 มันจะไม่ทำงาน คุณไม่สามารถหาค่าผกผันของพหุนามนี้ (AFAIK) ได้ - person haccks; 24.04.2017
comment
ให้ฉันถามคำถามแล้ว - 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))
person jfkoehler    schedule 08.02.2020