|
一个例子:
马尔可夫链近似求解随机微分方程程序的Matlab程序- function mecca_zj
- %马尔可夫链近似求解随机微分方程程序
- %最简单的情况,利用随机模拟的思想直接模拟飞行航迹。
- %利用多次模拟计算整体航迹空间分布的可能性
- %构建空间网格%%%%%%%%%%%%%%%%%
- M=500;
- N=1000;
- zMesh=repmat(0,[M N]);
- Max=50;
- %%%%%%%%%%%%%%%%%%%%%%%%%%%
- %模型参数和初值%%%%%%%%%%%%%%%%%%
- sigma=1;
- beita=1/5;
- lamga=1/(4*(sigma^2));
- X0=[-20;-30];
- derta=0.1;
- dertat=lamga*(derta^2);
- timef=40;
- stepMax=ceil(timef/dertat);
- %%%%%%%%%%%%%%%%%%%%%%%%%%%
- for i=1:Max
- %%%%%%%%%%%%%%%%%%%%%%%%%%%
- step=1;
- % 开始进入马尔可夫链的迭代过程
- X=X0;
- while(step<=stepMax)
- % X=pointP(:,step);
- % temp=(plan(step*dertat)+affine([0;0],step*dertat,0)*X);%无风场
- temp=(plan(step*dertat)+affine(X,step*dertat,1));%存在仿射不变的风场
- ekq=temp(1)/(2*(sigma^2)*(1-hfunction(X,beita)));
- nkq=temp(2)/(2*(sigma^2)*(1-hfunction(X,beita)));
- xkq=1/(lamga*(sigma^2)*(1-hfunction(X,beita)))-4;
- ckq=2*cosh(-derta*ekq)+2*cosh(-derta*nkq)+xkq;
-
- pkl=exp(-derta*ekq)/ckq;
- pkr=exp(derta*ekq)/ckq;
- pkd=exp(-derta*nkq)/ckq;
- pku=exp(derta*nkq)/ckq;
- pko=xkq/ckq;
- %%%%%%%%%%%%%%%%%%%%%%%%%
-
- seed=rand(1);
- if(seed<pkl)
- X=X+[-derta;0];
- elseif(seed<pkl+pkr)
- X=X+[derta;0];
- elseif(seed<pkl+pkr+pkd)
- X=X+[0;-derta];
- elseif(seed<pkl+pkr+pkd+pku)
- X=X+[0;derta];
- else
- X=X;
- end
-
- J=round(N*(X(1)+30)/90);
- I=round(M*(X(2)+50)/80);
- if((I<=0)|(I>M))
- I=M;
- end
- if((J<=0)|(J>N))
- J=N;
- end
- zMesh(I,J)=zMesh(I,J)+1;
- step=step+1;
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%%%
- i
- end
- temp=max(max(zMesh));
- zMesh=255*zMesh/temp;
- zMesh=uint8(zMesh);
- imshow(zMesh);
- imwrite(zMesh,'概率图.bmp','bmp');
复制代码- function v=plan(t)
- %飞行器的飞行计划,且与位置无关
- if(t<10)
- v=[2;0];
- elseif(t<20)
- v=[0;1];
- elseif(t<40)
- v=[2;0];
- else
- v=[0;0];
- end
复制代码- function f=affine(x,t,flag);
- %风场的仿射变换矩阵函数
- if(flag)
- R=(1/50)*[0 1;-1 0];
- z=[3*t;(t.^2)/2];
- % f=R*(x-z);
- f=R*x;
- else
- f=0;
- end
复制代码 |
|