如何在 matlab 中的 Ode45 中传递时间相关值
How to pass time dependent value in Ode45 in matlab
我正在使用来解决一个简单的 ode 函数。代码如下。
function window_sine
% Some constant values to be used later in the code.............
epsilon0=8.85*10^-12;
d_mos=0.65*10^-9;
epsilon_mos_min=5*epsilon0;
epsilon_mos_max=20*epsilon0;
d_g=10*10^-9;
epsilon_g=30*epsilon0;
epsilon_mos=5*epsilon0;
vt=0;
e=1.6*10^-19;
n=[];
i=1;
u=30; % cm^2/v*S
h=1.05*10^-34; % j*s
cond_d=e^2/h;
%tIME Step...........
step=0.1;
t = 0:step:10;
%Some other constant values..simple..............
c_g=(epsilon_g/d_g);
c_mos=(epsilon_mos/d_mos);
c_t=1/((1/c_g)+(1/c_mos));
% This below equation involves time "t" which is defined above.
vs=(1-(c_t/c_g))*t;
%ode function calling............
p0=0.01;
[t,p] = ode45(@state,t,p0);
%plotting the result..................
figure
plot(t,p)
title('State Variable')
%Now the Ode45 function.................
function dpdt = state( t,p)
nc=6.8*10^12;
smooth=1;
vg=t;
k=10^-1;
window1=1-((2*p)-1).^(2*smooth);
% How to incorporate the time dependent "n" value here..........
dpdt=k*(n-nc)*window1;
end
end
现在问题出在函数 "n" 上。它的时间依赖性及其值可以使用以下代码单独计算。
while i<length(t)
n(i)=((c_g*(t(i)-vs(i)-vt))/e)*(10^-4);% this 10^-4 is for cm^2 unit
i=i+1;
end
简而言之,"n" 的值随 "t" 线性增加。需要注意的是"t"处处相同,求导所用的时间。
问题是如何将这个依赖于时间的 "n" 值合并到我编写 "n" 的 ode 函数中。 ?
在哪里编写这部分代码,在功能块中还是在主代码中?
谢谢
请注意,您的 ode 函数的第一个参数是时间,恰好适用于像您的时间相关变量和流变约束。因此,只需将常量提供给您的函数并在您的 ode 函数中进行时间相关计算。
例如:
function dydt = myodefun(t,y,c)
n=1+t*c; % calculate your time-dependent value n
dydt = [y(2)*c; (1-y(1)^2)*y(2)-y(1)];
运行 例如:
c=1; % a constant, or a structure of constants
myodefunn=@(t,y)myodefun(t,y,c)
[tout,yout]=ode45(myodefunn,[0 20],[2 0]);
我正在使用来解决一个简单的 ode 函数。代码如下。
function window_sine
% Some constant values to be used later in the code.............
epsilon0=8.85*10^-12;
d_mos=0.65*10^-9;
epsilon_mos_min=5*epsilon0;
epsilon_mos_max=20*epsilon0;
d_g=10*10^-9;
epsilon_g=30*epsilon0;
epsilon_mos=5*epsilon0;
vt=0;
e=1.6*10^-19;
n=[];
i=1;
u=30; % cm^2/v*S
h=1.05*10^-34; % j*s
cond_d=e^2/h;
%tIME Step...........
step=0.1;
t = 0:step:10;
%Some other constant values..simple..............
c_g=(epsilon_g/d_g);
c_mos=(epsilon_mos/d_mos);
c_t=1/((1/c_g)+(1/c_mos));
% This below equation involves time "t" which is defined above.
vs=(1-(c_t/c_g))*t;
%ode function calling............
p0=0.01;
[t,p] = ode45(@state,t,p0);
%plotting the result..................
figure
plot(t,p)
title('State Variable')
%Now the Ode45 function.................
function dpdt = state( t,p)
nc=6.8*10^12;
smooth=1;
vg=t;
k=10^-1;
window1=1-((2*p)-1).^(2*smooth);
% How to incorporate the time dependent "n" value here..........
dpdt=k*(n-nc)*window1;
end
end
现在问题出在函数 "n" 上。它的时间依赖性及其值可以使用以下代码单独计算。
while i<length(t)
n(i)=((c_g*(t(i)-vs(i)-vt))/e)*(10^-4);% this 10^-4 is for cm^2 unit
i=i+1;
end
简而言之,"n" 的值随 "t" 线性增加。需要注意的是"t"处处相同,求导所用的时间。
问题是如何将这个依赖于时间的 "n" 值合并到我编写 "n" 的 ode 函数中。 ? 在哪里编写这部分代码,在功能块中还是在主代码中? 谢谢
请注意,您的 ode 函数的第一个参数是时间,恰好适用于像您的时间相关变量和流变约束。因此,只需将常量提供给您的函数并在您的 ode 函数中进行时间相关计算。
例如:
function dydt = myodefun(t,y,c)
n=1+t*c; % calculate your time-dependent value n
dydt = [y(2)*c; (1-y(1)^2)*y(2)-y(1)];
运行 例如:
c=1; % a constant, or a structure of constants
myodefunn=@(t,y)myodefun(t,y,c)
[tout,yout]=ode45(myodefunn,[0 20],[2 0]);