import numpy as np
import matplotlib.pylab as plt
def tube():
theta = np.linspace(0, np.pi/2, 30)
x = np.cos(theta)
y = np.sin(theta)
z = x*0.8
w = y*0.8
plt.plot(z,w)
plt.plot(x,y)
plt.axis("equal")
plt.show()
print plt.figure(1);tube()
def euler():
A, B, a = 40, 10, 2
t = 10 # time
dt = 1e-3 # interval
nbpt = int(t/dt)
n = 1
s = 1. # sign of the derivative, initially chosen
y = [0]*nbpt # result
while n < nbpt:
yp2 = B - A*y[n-1]**a
if yp2 < 0:
s = -s
n -= 1 # recalculating the previous value
else:
y[n] = y[n-1] + dt*s*np.sqrt(yp2)
n += 1
plt.plot(np.linspace(0,t,nbpt),y)
plt.show()
print plt.figure(2);euler()
我想在用euler()
制作的管中绘制用tube()
制作的曲线。我想我必须从笛卡尔坐标到极坐标,但是无论如何都要用Python来简化这个过程吗?
答案 0 :(得分:1)
有很多方法可以做到这一点,因为这个问题没有完全确定你正在寻找什么样的转型。但是,假设任何变换都会发生,只要结果曲线在管的边界线之间振荡,您可以使用:
def polarmap(x, y):
# normalize x and y from 0 to 1
x = (x-x.min())/(x.max()-x.min())
y = (y-y.min())/(y.max()-y.min())
# make theta go from 0 to pi/2
theta = np.pi*x/2
# make r go from 0.8 to 1.0 (the min and max tube radius)
r = 0.2*y + 0.8
# convert polar to cartesian
x = r*np.cos(theta)
y = r*np.sin(theta)
plt.plot(x, y)
例如,
import numpy as np
import matplotlib.pylab as plt
def tube():
theta = np.linspace(0, np.pi/2, 30)
x = np.cos(theta)
y = np.sin(theta)
z = x*0.8
w = y*0.8
plt.plot(z,w)
plt.plot(x,y)
def euler():
A, B, a = 40, 10, 2
t = 10 # time
dt = 1e-3 # interval
nbpt = int(t/dt)
n = 1
s = 1. # sign of the derivative, initially chosen
y = [0]*nbpt # result
while n < nbpt:
yp2 = B - A*y[n-1]**a
if yp2 < 0:
s = -s
n -= 1 # recalculating the previous value
else:
y[n] = y[n-1] + dt*s*np.sqrt(yp2)
n += 1
x = np.linspace(0,t,nbpt)
y = np.array(y)
return x, y
def polarmap(x, y):
# normalize x and y from 0 to 1
x = (x-x.min())/(x.max()-x.min())
y = (y-y.min())/(y.max()-y.min())
# make theta go from 0 to pi/2
theta = np.pi*x/2
# make r go from 0.8 to 1.0 (the min and max tube radius)
r = 0.2*y + 0.8
# convert polar to cartesian
x = r*np.cos(theta)
y = r*np.sin(theta)
plt.plot(x, y)
fig, ax = plt.subplots()
tube()
x, y = euler()
polarmap(x, y)
plt.axis("equal")
plt.show()
请注意,在polarmap
中,第一步是将x
和y
标准化,
它们的范围从0到1.您可以将它们视为相等的参数
立足点。如果在将两个参数传递给polarmap
之前交换它们,例如:
x, y = euler()
x, y = y, x # swap x and y
polarmap(x, y)
然后你得到