xdot(2)=x(1); %位移速度方程
%main.m clear;
v0=0;% 球的初始态 y0=1;
x_state=[v0,y0];% 球的初始状态赋值到状态变量中 dt=0.01;% 仿真步进
t=0:dt:5;% 仿真时间序列 K=1;% 碰撞衰减系数
x=zeros(length(t),length(x_state));%
for k=1:length(t)% 仿真开始,每次循环向前推进一个仿真步进dt x(k,:)=x_state;% 记录并保存当前状态的计算结果
[t_out,x_out]=ode45('pingpangstatefun',[t(k),t(k)+dt],x_state);% 计算下一时刻的新状态 x_state=x_out(length(x_out),:);% 更新状态
if(x_state(2)<=0) && (x_state(1)<0)% 当速度为负(向下运动)且已经接触碰撞面 x_state(1)=-K*x_state(1);% 处理碰撞瞬间情况:速度反向并衰减K end
%动画作图:显示小球弹跳过程 y=x_state(2);% 小球当前位置 subplot(2,1,1);
plot(0,y,'.','MarkerSize',40,'Color','black'); axis([-2 2 0 1]);% 坐标范围固定
set(gcf,'DoubleBuffer','on');% 双缓冲避免作图闪烁 drawnow;% 立即显示作图 end
%仿真结束,最后输出计算时间序列上的结果:随时间变化的速度和位移曲线 subplot(2,1,2);
plotyy(t,x(:,1),t,x(:,2),'plot');
补充:
1.按四舍五入取π的近似值3.14,则其相对误差限为
解:按四舍五入取近似值π=3.14,其绝对误差限为ε=0.005, 0.159%
2.π=3.1415926,取3.14做为近似值,误差为,有3位有效数字;若取3.141做为近似值,误差为,仍然是3位有效数字;若取3.142做为近似值,误差为有4位有效数字。 3.误差来源有哪几种?
(1). 模型误差(Modeling Error): (2). 观测误差(Measurement Error): (3). 截断误差(Truncation Error): (4).舍入误差(Roundoff Error)
4.线性方程组的数值解法一般有哪几种? 答:(1)高斯消去法;(2)LU分解法;(3)三对角矩阵追赶法;(4)迭代法 5.非线性方程的数值解法一般有:(1)二分法;(2)弦截法;(3)不动点迭代法;(4)牛顿迭代法 6.常微分方程u?(t)?f(t,u)对应的显式Euler公式为uk?1?uk?hf(tk,uk);对应的隐式Euler公式为
11
uk?1?uk?hf(tk?1,uk?1);对应的两步法Euler公式为uk?1?uk?1?2hf(tk,uk)
7.数值微分是用邻近一些点上的函数值近似表示函数在一个点上的各阶导数值,Rung-Kutta方法就是基于这一思路,用f(t,u(t))在一些特殊点上函数值的线性组合来表示泰勒展开中某点的各阶导数值。最常用的四阶RK公式为:
12