MATLAB问题求解:微分方程组解的概率分布

m=4.1888*10^(-6);k=9.3*10^(-7);g=9.8;%参数ts=0:0.001:2;%时间区间%初始值x(0)=0y(0)=0x'(0)=10*si... m=4.1888*10^(-6);k=9.3*10^(-7);g=9.8;%参数
ts=0:0.001:2;%时间区间
%初始值 x(0)=0 y(0)=0 x'(0)=10*sin(i) y(0)'=cos(i)
for i=0:0.025:pi
z0=[ 0; 0; 10*sin(i); 10*cos(i)];
fun=@(t,z)[z(3);z(4);...
-k/m*z(3)*sqrt(z(3)^2+z(4)^2);...
-k/m*z(4)*sqrt(z(3)^2+z(4)^2)-g];
[t,z]=ode45(fun,ts,z0);
subplot(121),plot(t,z(:,1:2));
xlabel('t');legend('x','y');
axis([0 1.48 0 7 ])
hold on
subplot(122),plot(z(:,1),z(:,2));
axis([-5 5 0 3 ])
xlabel('x');ylabel('y');
hold on
end

我解出这个方程组之后,图像大家可以看看。
想知道当y=0时,x的密度函数。就是x在每个小区间x±δt内,有多少条“线”
展开
dukinkin
2014-11-16 · TA获得超过1.3万个赞
知道大有可为答主
回答量:2444
采纳率:90%
帮助的人:921万
展开全部

function []=test2

m=4.1888*10^(-6);k=9.3*10^(-7);g=9.8;%参数

N=5000;  %角度分段

ts=[0 2];%时间区间,确保时间足够回到y=0就可以

fun=@(t,z)[z(3);z(4);...

    -k/m*z(3)*sqrt(z(3)^2+z(4)^2);...

    -k/m*z(4)*sqrt(z(3)^2+z(4)^2)-g];

op=odeset('Events',@evenfun);

ang=linspace(0,pi,N);

x=nan(size(ang));

for i=1:length(ang);

    %初始值 x(0)=0 y(0)=0 x'(0)=10*sin(i) y(0)'=cos(i)

    z0=[    0;      0;   10*sin(ang(i)); 10*cos(ang(i))];

    [t,z,TE,ZE]=ode45(fun,ts,z0,op);%TE触发事件时间,ZE事件被触发时的状态

    %当检查到y重新回到0,停止计算,这时候TE是发生的时刻,ZE是这时候的状态

    %可以ZE(2)在误差范围内为0表示回到y=0,ZE(1)就是这时候的横坐标

    %t=0时刻y=0,为了排除一开始的点,下边设定条件要时间TE大于0的值才能算回到y=0

    %平抛和向下抛的过程都不可能回到y=0了

    if TE>eps,x(i)=ZE(1);end

end

x=x(~isnan(x));%得到的向量x就是每条轨迹除了起始点外和y=0的交点的x值

%分区间统计,可以统计不同区间内交点的个数

hist(x,50);%这里给出分50个区间统计的结果

%角度分段N越大统计越精确,不过计算需要时间也长

%统计区间越多得到的分布分辨越好,但是质量越差

%通常根据N的取值,确定分区间数,太多太少都不好

%最后图像是统计频数的分布

end


function [value,isterminal,direction]=evenfun(t,z)

    value=z(2);%事件z(2)=0,也就是y=0

    isterminal=1;%事件触发,停止计算

    direction=-1;%方向负,也就是从y大于0到y小于0

end



这里将角度分了5000分,可能需要计算半分钟左右的时间

如果将所有的统计加起来应该只有一半也就是2500的事件

因为从平抛开始后边的都不可能再回到y=0

所以实际上,可以将角度范围控制在0~pi/2可以减少计算量

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式