计算曲线长度,根据线积分公式:
,令积分函数 f(x,y,z) 为1,即计算曲线的长度,将其微元化:
其中
根据此时便可在python编程实现,给出4个例子,代码中已有详细注释,不再赘述
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
''' 计算曲线长度,根据线积分公式: \int_a^bf(x,y,z)dl,令积分函数为1,即计算曲线的长度 ''' import numpy as np from mpl_toolkits.mplot3d import * import matplotlib.pyplot as plt ## 求二维圆周长,半径为1,采用参数形式 def circle_2d(dt = 0.001 ,plot = true): dt = dt # 变化率 t = np.arange( 0 , 2 * np.pi, dt) x = np.cos(t) y = np.sin(t) # print(len(t)) area_list = [] # 存储每一微小步长的曲线长度 for i in range ( 1 , len (t)): # 计算每一微小步长的曲线长度,dx = x_{i}-x{i-1},索引从1开始 dl_i = np.sqrt( (x[i] - x[i - 1 ]) * * 2 + (y[i] - y[i - 1 ]) * * 2 ) # 将计算结果存储起来 area_list.append(dl_i) area = sum (area_list) # 求和计算曲线在t:[0,2*pi]的长度 print ( "二维圆周长:{:.4f}" . format (area)) if plot: fig = plt.figure() ax = fig.add_subplot( 111 ) ax.plot(x,y) plt.title( "circle" ) plt.show() ## 二维空间曲线,采用参数形式 def curve_param_2d(dt = 0.0001 ,plot = true): dt = dt # 变化率 t = np.arange( 0 , 2 * np.pi, dt) x = t * np.cos(t) y = t * np.sin(t) # print(len(t)) area_list = [] # 存储每一微小步长的曲线长度 # 下面的方式是循环实现 # for i in range(1,len(t)): # # 计算每一微小步长的曲线长度,dx = x_{i}-x{i-1},索引从1开始 # dl_i = np.sqrt( (x[i]-x[i-1])**2 + (y[i]-y[i-1])**2 ) # # 将计算结果存储起来 # area_list.append(dl_i) # 更加pythonic的写法 area_list = [np.sqrt( (x[i] - x[i - 1 ]) * * 2 + (y[i] - y[i - 1 ]) * * 2 ) for i in range ( 1 , len (t))] area = sum (area_list) # 求和计算曲线在t:[0,2*pi]的长度 print ( "二维参数曲线长度:{:.4f}" . format (area)) if plot: fig = plt.figure() ax = fig.add_subplot( 111 ) ax.plot(x,y) plt.title( "2-d parameter curve" ) plt.show() ## 二维空间曲线 def curve_2d(dt = 0.0001 ,plot = true): dt = dt # 变化率 t = np.arange( - 6 , 10 , dt) x = t y = x * * 3 / 8 - 4 * x + np.sin( 3 * x) # print(len(t)) area_list = [] # 存储每一微小步长的曲线长度 # for i in range(1,len(t)): # # 计算每一微小步长的曲线长度,dx = x_{i}-x{i-1},索引从1开始 # dl_i = np.sqrt( (x[i]-x[i-1])**2 + (y[i]-y[i-1])**2 ) # # 将计算结果存储起来 # area_list.append(dl_i) area_list = [np.sqrt( (x[i] - x[i - 1 ]) * * 2 + (y[i] - y[i - 1 ]) * * 2 ) for i in range ( 1 , len (t))] area = sum (area_list) # 求和计算曲线在t:[0,2*pi]的长度 print ( "二维曲线长度:{:.4f}" . format (area)) if plot: fig = plt.figure() ax = fig.add_subplot( 111 ) ax.plot(x,y) plt.title( "2-d curve" ) plt.show() ## 三维空间曲线,采用参数形式 def curve_3d(dt = 0.001 ,plot = true): dt = dt # 变化率 t = np.arange( 0 , 2 * np.pi, dt) x = t * np.cos(t) y = t * np.sin(t) z = 2 * t # print(len(t)) area_list = [] # 存储每一微小步长的曲线长度 for i in range ( 1 , len (t)): # 计算每一微小步长的曲线长度,dx = x_{i}-x{i-1},索引从1开始 dl_i = np.sqrt( (x[i] - x[i - 1 ]) * * 2 + (y[i] - y[i - 1 ]) * * 2 + (z[i] - z[i - 1 ]) * * 2 ) # 将计算结果存储起来 area_list.append(dl_i) area = sum (area_list) # 求和计算曲线在t:[0,2*pi]的长度 print ( "三维空间曲线长度:{:.4f}" . format (area)) if plot: fig = plt.figure() ax = fig.add_subplot( 111 ,projection = '3d' ) ax.plot(x,y,z) plt.title( "3-d curve" ) plt.show() if __name__ = = '__main__' : circle_2d(plot = true) curve_param_2d(plot = true) curve_2d(plot = true) curve_3d(plot = true) |
得到结果:
1
2
3
4
|
二维圆周长: 6.2830 二维参数曲线长度: 21.2558 二维曲线长度: 128.2037 三维空间曲线长度: 25.3421 |
以上这篇python微元法计算函数曲线长度的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/ouening/article/details/82698830