用曲率,挠率反求曲线方程!(作业捷径篇 续集)

在这里插入图片描述


时隔两天,前一篇文章阅览量竟然还未破1000(555),但是为了能够最快速度完成本周微分几何作业,我加工1h整出来了本次文章的计算代码。

上次文章我们解决的问题是给定曲线下曲率与挠率的计算,这次我们反其道而行之。

根据曲线论基本定理一节课内容的知识我们知道了在曲率与挠率确定的条件下,空间曲线是唯一的(在刚体变换等价类的意义下)。那么,当我们知道空间曲线的曲率与挠率,我们理应可以按照以下常微分方程求出对应的曲线的参数表示:
{ r ′ ( s ) = t ( s ) t ′ ( s ) = κ ( s ) ∗ n ( s ) n ′ ( s ) = − κ ( s ) ∗ t ( s ) + τ ( s ) ∗ b ( s ) b ′ ( s ) = − τ ( s ) ∗ n ( s ) \left\{ \begin{aligned} r'(s)=&t(s) \\ t'(s)=&\kappa(s)*n(s)\\ n'(s)=&-\kappa(s)*t(s)+\tau(s)*b(s)\\ b'(s)=&-\tau(s)*n(s)\end{aligned} \right. r(s)=t(s)=n(s)=b(s)=t(s)κ(s)n(s)κ(s)t(s)+τ(s)b(s)τ(s)n(s)
用矩阵形式表示即为:
d d s ( r ( s ) t ( s ) n ( s ) b ( s ) ) = ( 0 1 0 0 0 0 κ ( s ) 0 0 κ ( s ) 0 τ ( s ) 0 0 − τ ( s ) 0 ) ( r ( s ) t ( s ) n ( s ) b ( s ) ) \begin{aligned} \frac{d}{ds}\left(\begin{array}{c} r(s) \\ t(s)\\ n(s)\\ b(s) \end{array}\right)= \left(\begin{array}{cccc} 0&1&0&0\\ 0&0&\kappa(s)&0\\ 0&\kappa(s)&0&\tau(s)\\ 0&0&-\tau(s)&0 \end{array}\right) \left(\begin{array}{c} r(s) \\ t(s)\\ n(s)\\ b(s) \end{array}\right) \end{aligned} dsdr(s)t(s)n(s)b(s)=000010κ(s)00κ(s)0τ(s)00τ(s)0r(s)t(s)n(s)b(s)
对于非常系数线性微分方程,我们并没有较好的解决方法,但是我们可以通过计算机进行求解。

我们举下面一个习题作为例子:


  1. (1)求曲率 κ ( s ) = a / ( a 2 + s 2 ) \kappa(s)=a/(a^2+s^2) κ(s)=a/(a2+s2)( s s s为弧长参数)的平面曲线;
    (2)求曲率 κ ( s ) = 1 / a 2 − s 2 \kappa(s)=1/\sqrt{a^2-s^2} κ(s)=1/a2s2 ( s s s为弧长参数)的平面曲线.

我们发现这里只需要求平面上的曲线,而不需要求空间上的曲线,因而我们只需要假定挠率 τ = 0 \tau=0 τ=0(挠率为0时,曲线为平面曲线)。

我们直接上代码:

from sympy import *
from sympy.plotting import plot3d_parametric_line,plot_parametric
import re

我们这次要用的库有上次使用过的符号计算库sympy,以及其对应的绘制三维和二维图像的两个函数,以及进行数据清洗的re库。

#自变量
s = symbols('s', real=True)
# r的三个分量
r1 = Function('r1')
r2 = Function('r2')
r3 = Function('r3')
#r=Matrix([r1,r2,r3])
# t的三个分量
t1 = Function('t1')
t2 = Function('t2')
t3 = Function('t3')
#t=Matrix([t1,t2,t3])
# n的三个分量
n1 = Function('n1')
n2 = Function('n2')
n3 = Function('n3')
#n=Matrix([n1,n2,n3])
# b的三个分量
b1 = Function('b1')
b2 = Function('b2')
b3 = Function('b3')
#b=Matrix([b1,b2,b3])

我们用sympy定义出相应的自变量和函数。需要注意的是,我们上面列出的微分方程中 r , t , n , b r,t,n,b r,t,n,b都是三维的列向量,因而总方程数要有更多,在这里我们也是用分量的形式来进行定义的。

# 曲率与挠率
a=1
k = a/(a**2+s**2)# 曲率
tao = 0  # 挠率

我们输入题目中给定的曲率与挠率。(因为不会带参数的微分方程求解,因而暂时取参数a为1)(会的朋友欢迎加我好友进行交流)

eq = [r1(s).diff(s) - t1(s),
      r2(s).diff(s) - t2(s),
      r3(s).diff(s) - t3(s),
      t1(s).diff(s) - k * n1(s),
      t2(s).diff(s) - k * n2(s),
      t3(s).diff(s) - k * n3(s),
      n1(s).diff(s) + k * t1(s) - tao * b1(s),
      n2(s).diff(s) + k * t2(s) - tao * b2(s),
      n3(s).diff(s) + k * t3(s) - tao * b3(s),
      b1(s).diff(s) + tao * n1(s),
      b2(s).diff(s) + tao * n2(s),
      b3(s).diff(s) + tao * n3(s)]
con = {r1(0): 0, r2(0): 0, r3(0): 0, 
	   t1(0): 1, t2(0): 0, t3(0): 0, 
	   n1(0): 0, n2(0): 1, n3(0): 0, 
	   b1(0): 0, b2(0): 0, b3(0): 1}

我们将微分方程组和初值条件分别用列表和字典属性进行储存,

a = dsolve(eq, ics=con)
b=a[0:3]
print(str(b[0]),str(b[1]),str(b[2]),sep='\n')

用dsolve函数解出相应的方程组,并取出 r r r的成分 r 1 , r 2 , r 3 r1,r2,r3 r1,r2,r3.
得到的结果为:
r 1 ( s ) = a s i n h ( s ) ; r 2 ( s ) = s 2 + 1 − 1 ; r 3 ( s ) = 0. r_1(s)=asinh(s);r_2(s)=\sqrt{s^2 + 1} - 1;r_3(s)=0. r1(s)=asinh(s);r2(s)=s2+1 1;r3(s)=0.

我们还能对其曲线进行绘制:

R1=eval(re.findall(',.*\)',str(b[0]))[0][1:-1])
R2=eval(re.findall(',.*\)',str(b[1]))[0][1:-1])
R3=eval(re.findall(',.*\)',str(b[2]))[0][1:-1])
if R1==0:
    plot_parametric(R2,R3,(s,-100,100),title='R2-R3')
elif R2==0:
    plot_parametric(R1, R3, (s, -100, 100),title='R1-R3')
elif R3==0:
    plot_parametric(R1, R2, (s, -100, 100),title='R1-R2')
else:
    plot3d_parametric_line(R1,R2,R3,(s,-100,100))

得到了解的积分曲线:
在这里插入图片描述
同样的方法我们可以解答第二问的答案:
r 1 ( s ) = s ∗ 1 − s 2 / 2 + a s i n ( s ) / 2 ; r 2 ( s ) = s 2 / 2 ; r 3 ( s ) = 0. r_1(s)=s*\sqrt{1 - s^2}/2 + asin(s)/2;r_2(s)=s^2/2;r_3(s)=0. r1(s)=s1s2 /2+asin(s)/2;r2(s)=s2/2;r3(s)=0.
其积分曲线的图像为:
在这里插入图片描述


原创不易,欢迎大家一键三连!


文案:锦帆远航
代码:锦帆远航
图片:锦帆远航 百度百科

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值