機器人學-一道面試題
阿新 • • 發佈:2018-11-08
\(求解過程如下:\)
\(化簡得到:\)
\(y''=100*cos(y)-100*sin(y)\) ①
\(x''=g=9.81\) ②
\(對①式進行積分得到如下結果:\)
\(1/2*y'*y'=100*sin(y)+100*cos(y)+C\) ③
\(由於y(0)=y'(0)=0, 帶入求解得到C=-100,\)
$ y'=dy/dt=10\sqrt2 \sqrt((cos(y)+sin(y)-1))$ ④
$ ④式無法進一步化簡,若採用wolfram alpha求解得到複雜的Appell超幾何函式,②式進行兩次積分得到如下結果$
\(x=1/2*9.81*t*t\)
\(綜上轉化為求解一階非線性方程問題,x, y都與給定時間t有關, 採用python語言程式設計,利用龍格庫塔演算法進行非線性方程數值求解與繪製(x,y)圖\)
import math
from math import sin,cos
import numpy as np
import matplotlib.pyplot as plt
def runge_kutta(y, t, dt, f):
k1 = dt * f(y, t)
k2 = dt * f(y + 0.5 * k1, t + 0.5 * dt)
k3 = dt * f(y + 0.5 * k2, t + 0.5 * dt)
k4 = dt * f(y + k3, t + dt)
return y + (k1 + 2 * k2 + 2 * k3 + k4) / 6.
if name=='main
t = 0.
y = 0.
x = 0
dt =0.1 #需要給定步長
ys, ts, xs = [], [], []
def func(y, t):
return 10math.sqrt(2)math.sqrt((sin(y)+cos(y)-1))
while t <= 10:
y = runge_kutta(y, t, dt, func)
x=0.59.81t*t
t += dt
ys.append(y)
ts.append(t)
xs.append(x)
plt.plot(xs, ys, label='Nonlinear_equations')
plt.legend()
plt.show()