对一阶 ODE 系统进行数值积分的代码

计算科学 matlab
2021-11-26 03:26:43

我需要求解以下微分方程组。 在此处输入图像描述

当我有解决方案时nfv,我需要找到并绘制J=enfv.

我在 matlab 中编写了一个包含所有 ODE 的代码,如下所示:

      function systemSolve
      clc


      tr=50e-12;        % Recombination lifetime
      n0=1e11;         % Density of free carriers (Recordar que es 1e17 cm-3)
      tc=2e-12;         % Trapping time
      ts=30e-15;        % Carrier scattering time
      m=0.067*9.11e-31; % effective mass GaAs
      ev=8.854e-12;     % permitivity  
      n=900;            % factor geometry
      q=1.6e-19         % electron charge

      de=50e-15         %  delta t


      timeRange=[0 0.1e-12]; 
      initialConditionVector=[0;1e-15;1e-15;1e-15];
      [t,x]=ode45(@xprime,timeRange,initialConditionVector);
      figure(1),plot(t,x(:,1))

      J=q*x(:,3).*x(:,1);
      figure(2),plot(t,J)

      function f=xprime(t,x)
      f=[x(4); ...
        -(x(2)/tr)+(x(3)*q*x(1)); ...
        -(x(3)/tc)+(n0*(exp((t/de)^2))); ...
        -((1/ts)*x(4))-(((x(3)*q^2)/m*ev)*x(1)/n)+(q*x(2)/(m*n*ev*tr))];
      end
end

我想:

x1=v

x2=Psc

x3=nf

x4=x1

我希望找到一个如图 1 所示的电流脉冲,但我得到了一个指数解决方案。

图1

这段代码有什么问题,你能建议我如何解决这个问题吗?

1个回答

您可以使用 MATLAB 的ode45,请参考这里的第一个示例:求解非刚性微分方程;低阶法

我在这里使用y代替x. 如果你不知道怎么写func.m脚本并将其保存在您的路径中,您也可以使用函数句柄,在您的情况下:

% output of function handle in vector form
rigid = @(t,y)[x(4); -x(2)+x(3);  ??? ; ???];
options = odeset('RelTol',1e-6,'AbsTol',[1e-6 1e-6 1e-6 1e-6]);
[t,y] = ode45(rigid,[0 T],[y10 y20 y30 y40],options);

???留给您填写,options如果您阅读上面链接的文档,您可以调整,y10通过y40是初始值。最后J = y(:,1).*y(:,3)然后绘制 J反对t.