Euler法matlab表示

function example1_euler_method


T= 1;
h = 0.1;
% h = 0.05;
% h = 0.01;
t = 0:h:T;
N = length(t) - 1;
solu = exp(-5*t);

u0 = 1 ;
f = @f1;
u_euler = euler(f,u0,t,h,N);
u_implicit = implicit_euler(f,u0,t,h,N);
u_modified = modified_euler(f,u0,t,h,N);

figure(1)
plot(t,u_euler,'*b', t,u_implicit,'gs',t,u_modified,'s',t,solu,'r')
legend('Euler','Implicit-Euler','Modified-Euler','Exact-soln')
end

function u=euler(f,u0,t,h,N)%显式
u=zeros(N+1,1);
u(1)=u0;
for n=1:N
    fn=f(t(n),u(n));
    u(n+1)=u(n)+h*fn;
end
end





function u = implicit_euler(f,u0,t,h,N)%隐式
u = zeros(N+1,1);
u(1) = u0;
eps_in = 1e-6;
K_in = 6;
for n=1:N
s1 = u(n);
du = 1;
k = 1;
    while abs(du)>eps_in & k<K_in
          s2 = u(n) + h*f(t(n+1),s1);
          du = s2 - s1;
          s1 = s2;
          k = k + 1;
    end
u(n+1) = s2;
end
end

function u = modified_euler(f,u0,t,h,N)%改进的euler法
u = zeros(N+1,1);
u(1) = u0;
eps_in = 1e-6;
K_in = 6;
for n = 1:N
fn = f(t(n),u(n));
s1 = u(n);
du = 1;
k = 1;
while abs(du)>eps_in & k<K_in
    s2 = u(n) + 0.5*h*(fn + f(t(n+1),s1));
    du = s2 - s1 ;
    s1 = s2;
    k = k + 1;
end
u(n+1) = s2;
end
end

function f = f1(t,u)
f =-5*u;
end

其中显Euler法中 y n + 1 y_n+1 yn+1可由 y n y_n yn直接表示出,而隐Euler法和改进的Euler法中, y n + 1 y_n+1 yn+1不可可由 y n y_n yn直接表示出,使用不动点迭代法求解 y n + 1 y_n+1 yn+1.
代码中当精度小于1e-6或迭代满六次得出 y n + 1 y_n+1 yn+1
在这里插入图片描述
因为h足够小,且 f ′ = − 5 f^{'}=-5 f=5满足不动点定理条件。

以下为t与隐Euler法的图。

clc,clear
T= 1;
h = 0.1;
% h = 0.05;
% h = 0.01;
t = 0:h:T;
N = length(t) - 1;
solu = exp(-5*t);
u0 = 1 ;
f = @f1;

u = zeros(N+1,1);
u(1) = u0;
eps_in = 1e-6;
K_in = 6;
for n=1:N
s1 = u(n);
du = 1;
k = 1;
    while abs(du)>eps_in & k<K_in
          s2 = u(n) + h*f(t(n+1),s1);
          du = s2 - s1;
          s1 = s2;
          k = k + 1;
    end
    %不动点迭代法
u(n+1) = s2;
end


figure(1)
u_implicit = u;
plot(t,u_implicit,'gs',t,solu,'r')


function f = f1(t,u)
f =-5*u;
end

隐Euler法和改进的Euler法中,使用不动点迭代法求解 y n + 1 y_n+1 yn+1.

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值