1. 程式人生 > >機器人學-一道面試題

機器人學-一道面試題

\(求解過程如下:​\)

\(化簡得到:\)

\(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()