From 3cbd6471718055229a5186d3c2db7371a9312f33 Mon Sep 17 00:00:00 2001 From: easternDay <849919718@qq.com> Date: Wed, 19 Jun 2019 12:25:27 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E4=BB=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 287 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 287 insertions(+) create mode 100644 readme.md diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..3fb2d61 --- /dev/null +++ b/readme.md @@ -0,0 +1,287 @@ +# 物理曲线的Pytthon绘制 +## 所需Lib +1. matplotlib +2. numpy +## 所绘制曲线 +1. 重力势能曲线 +2. 抛体运动曲线 +3. 点电荷电力线分布 +4. 电偶极子电力线和等势面分布 +5. 简谐振动 +6. 李萨如图形 +## 代码实现 +```Python +#coding:utf-8 +import numpy as np +import matplotlib.pyplot as plt + +# 支持中文 +plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 + + +# 控制图形的长和宽单位为英寸, +# 调用figure创建一个绘图对象,并且使它成为当前的绘图对象。 +plt.figure(figsize=(5,5)) +# 设置X轴的范围 +plt.xlim(0,10) +# 设置Y轴的范围 +plt.ylim(0,100) + +# 曲线设置 +x=np.linspace(0,10,10) +y=np.array(9.8*x) + +#$可以让字体变得跟好看 +#给所绘制的曲线一个名字,此名字在图示(legend)中显示。 +# 只要在字符串前后添加"$"符号,matplotlib就会使用其内嵌的latex引擎绘制的数学公式。 +#color : 指定曲线的颜色 +#linewidth : 指定曲线的宽度 +plt.plot(x,y, '--c',marker='o',label="$9.8*x$",color="red",linewidth=2, markersize=5) +#设置X轴的文字 +plt.xlabel("High(下落高度)") +#设置Y轴的文字 +plt.ylabel("Ep(重力势能)") +#设置图表的标题 +plt.title("重力势能曲线") + + +#显示图示 +plt.legend() +#显示出我们创建的所有绘图对象。 +plt.show() +``` +```Python +import numpy as np +import matplotlib.pyplot as plt + +def projectile(V_initial, theta, bouyancy=True, drag=True): + g = 9.81 + m = 1 + C = 0.47 + r = 0.5 + S = np.pi*pow(r, 2) + ro_mars = 0.0175 + + time = np.linspace(0, 100, 10000) + tof = 0.0 + dt = time[1] - time[0] + bouy = ro_mars*g*(4/3*np.pi*pow(r, 3)) + gravity = -g * m + V_ix = V_initial * np.cos(theta) + V_iy = V_initial * np.sin(theta) + v_x = V_ix + v_y = V_iy + r_x = 0.0 + r_y = 0.0 + r_xs = list() + r_ys = list() + r_xs.append(r_x) + r_ys.append(r_y) + # This gets a bit 'hand-wavy' but as dt -> 0 it approaches the analytical solution. + # Just make sure you use sufficiently small dt (dt is change in time between steps) + for t in time: + F_x = 0.0 + F_y = 0.0 + if (bouyancy == True): + F_y = F_y + bouy + if (drag == True): + F_y = F_y - 0.5*C*S*ro_mars*pow(v_y, 2) + F_x = F_x - 0.5*C*S*ro_mars*pow(v_x, 2) * np.sign(v_y) + F_y = F_y + gravity + + r_x = r_x + v_x * dt + (F_x / (2 * m)) * dt**2 + r_y = r_y + v_y * dt + (F_y / (2 * m)) * dt**2 + v_x = v_x + (F_x / m) * dt + v_y = v_y + (F_y / m) * dt + if (r_y >= 0.0): + r_xs.append(r_x) + r_ys.append(r_y) + else: + tof = t + r_xs.append(r_x) + r_ys.append(r_y) + break + + return r_xs, r_ys, tof + +v = 30 +theta = np.pi/4 + +fig = plt.figure(figsize=(8,4), dpi=100) +r_xs, r_ys, tof = projectile(v, theta, True, True) +plt.plot(r_xs, r_ys, 'g:', label="Gravity, Buoyancy, and Drag") +r_xs, r_ys, tof = projectile(v, theta, False, True) +plt.plot(r_xs, r_ys, 'b:', label="Gravity and Drag") +r_xs, r_ys, tof = projectile(v, theta, False, False) +plt.plot(r_xs, r_ys, 'k:', label="Gravity") +plt.title("Trajectory", fontsize=14) +plt.xlabel("Displacement in x-direction (m)") +plt.ylabel("Displacement in y-direction (m)") +plt.ylim(bottom=0.0) +plt.legend() +plt.show() +``` +```Python +#coding:utf-8 +import numpy as np +import matplotlib.pyplot as plt +import math + +# 支持中文 +plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 +#显示负号 +plt.rcParams['axes.unicode_minus'] = False + + +# 控制图形的长和宽单位为英寸, +# 调用figure创建一个绘图对象,并且使它成为当前的绘图对象。 +plt.figure(figsize=(5,5)) +# 设置X轴的范围 +plt.xlim(-10,10) +# 设置Y轴的范围 +plt.ylim(-10,10) + +# 曲线设置 +x=np.linspace(0,10,10) +y=np.array(x) + +#$可以让字体变得跟好看 +#给所绘制的曲线一个名字,此名字在图示(legend)中显示。 +# 只要在字符串前后添加"$"符号,matplotlib就会使用其内嵌的latex引擎绘制的数学公式。 +#color : 指定曲线的颜色 +#linewidth : 指定曲线的宽度 +rad = 0 +for i in range(-50,50): + y = math.tan(rad)*x + rad += math.pi/6 + plt.plot(x,y, '--c',marker='^',color="red",linewidth=2, markersize=5) + plt.plot(-x,y, '--c',marker='^',color="red",linewidth=2, markersize=5) +plt.plot(0,0, '--c',marker='o',label="点电荷",color="blue",linewidth=2, markersize=15) +#设置图表的标题 +plt.title("点电荷电力线分布") + + +#显示图示 +plt.legend() +#显示出我们创建的所有绘图对象。 +plt.show() +``` +```Python +from matplotlib.tri import ( + Triangulation, UniformTriRefiner, CubicTriInterpolator) +import matplotlib.pyplot as plt +import matplotlib.cm as cm +import numpy as np + +#----------------------------------------------------------------------------- +# Electrical potential of a dipole +#----------------------------------------------------------------------------- +def dipole_potential(x, y): + """ The electric dipole potential V """ + r_sq = x**2 + y**2 + theta = np.arctan2(y, x) + z = np.cos(theta)/r_sq + return (np.max(z) - z) / (np.max(z) - np.min(z)) + +#----------------------------------------------------------------------------- +# Creating a Triangulation +#----------------------------------------------------------------------------- +# First create the x and y coordinates of the points. +n_angles = 30 +n_radii = 10 +min_radius = 0.2 +radii = np.linspace(min_radius, 0.95, n_radii) + +angles = np.linspace(0, 2 * np.pi, n_angles, endpoint=False) +angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1) +angles[:, 1::2] += np.pi / n_angles + +x = (radii*np.cos(angles)).flatten() +y = (radii*np.sin(angles)).flatten() +V = dipole_potential(x, y) + +# Create the Triangulation; no triangles specified so Delaunay triangulation +# created. +triang = Triangulation(x, y) + +# Mask off unwanted triangles. +triang.set_mask(np.hypot(x[triang.triangles].mean(axis=1), + y[triang.triangles].mean(axis=1)) + < min_radius) + +#----------------------------------------------------------------------------- +# Refine data - interpolates the electrical potential V +#----------------------------------------------------------------------------- +refiner = UniformTriRefiner(triang) +tri_refi, z_test_refi = refiner.refine_field(V, subdiv=3) + +#----------------------------------------------------------------------------- +# Computes the electrical field (Ex, Ey) as gradient of electrical potential +#----------------------------------------------------------------------------- +tci = CubicTriInterpolator(triang, -V) +# Gradient requested here at the mesh nodes but could be anywhere else: +(Ex, Ey) = tci.gradient(triang.x, triang.y) +E_norm = np.sqrt(Ex**2 + Ey**2) + +#----------------------------------------------------------------------------- +# Plot the triangulation, the potential iso-contours and the vector field +#----------------------------------------------------------------------------- +fig, ax = plt.subplots() +ax.set_aspect('equal') +# Enforce the margins, and enlarge them to give room for the vectors. +ax.use_sticky_edges = False +ax.margins(0.07) + +ax.triplot(triang, color='0.8') + +levels = np.arange(0., 1., 0.01) +cmap = cm.get_cmap(name='hot', lut=None) +ax.tricontour(tri_refi, z_test_refi, levels=levels, cmap=cmap, + linewidths=[2.0, 1.0, 1.0, 1.0]) +# Plots direction of the electrical vector field +ax.quiver(triang.x, triang.y, Ex/E_norm, Ey/E_norm, + units='xy', scale=10., zorder=3, color='blue', + width=0.007, headwidth=3., headlength=4.) + +ax.set_title('Gradient plot: an electrical dipole') +plt.show() +``` +```Python +import matplotlib.pyplot as plt +import numpy as np + + +def f(t): + return np.cos(2 * np.pi * t) + + +a = np.arange(0.0, 5.0, 0.02) + +plt.plot(a, f(a)) +plt.xlabel('横坐标(时间)', fontproperties='Kaiti', fontsize=14, color='red') +plt.ylabel('纵坐标(振幅)', fontproperties='SimHei', fontsize=18, color='red') +plt.title('简谐运动 y=cos(2πx)', fontproperties='SimHei', fontsize=18, color='green') +plt.grid(True) +plt.axis([-1, 6, -2, 2]) +plt.annotate('简谐运动曲线', xy=(3, 1), xytext=(4, 1.5), arrowprops=dict(facecolor='black', shrink=0.2), + fontproperties='SimHei', fontsize=12, color='red') + +plt.show() +``` +```Python +import numpy as np +from matplotlib.pyplot import plot +from matplotlib.pyplot import show +a = float(input()) +b = float(input()) +t = np.linspace(-np.pi, np.pi, 201) +x = np.sin(a * t + np.pi/2) +y = np.sin(b * t) +plot(x, y) +show() +``` +## GITHUB链接 +[东方怂天的GitHub][1] + + +[1]:https://github.com/easternDay/Physical-curve-drawing -- GitLab