第四次上机
一、用欧拉法求习题 7.2
y`=10*(1-y)
y(0)=0
1. 程序
function [y_]=fun(x,y)
y_=10.*x.*(1-y);
end
%y(0)=0 初始值
%习题 7.2
%函数 y_=10.*x.*(1-y),精确函数 y=1-exp(-5*x^2)
y=0;
h=0.1;
fprintf('欧拉法:\n');
tic
for i=1:1/h
x=i*h;
accuracy=1-exp(-5*x^2);
fprintf('计算值 x=%.5f\ty=%.5f\t 精确值%.5f\t 误差%.5f\n',x,y,accuracy,abs(y-accuracy));
k=fun(x,y);
y=y+h*k;
%一阶导,求的是斜率
%横坐标值
%计算值
end
toc
%与 tic 成对出现,计算程序运行时间
fprintf('改进欧拉法:\n');
tic
%求第一个点(x,y)的斜率 k1 和第二个点(x+h,y+K1*h)的斜率 k2
y=0;
h=0.1;
for i=1:1/h
x=i*h;
accuracy=1-exp(-5*x^2);
fprintf('计算值 x=%.5f\ty=%.5f\t 精确值%.5f\t 误差%.5f\n',x,y,accuracy,abs(y-accuracy));
k1=fun(x,y);
k2=fun(x+h,y+k1*h);
y=y+h*(k1+k2)/2;
%第一点斜率
%第二点斜率
end
toc
fprintf('龙格库塔方法:\n');
tic
%与改进欧拉法相似,只是需要四个 K
h=0.1;
y=0;
for i=1:1/h
x=i*h;
accuracy=1-exp(-5*x^2);
fprintf('计算值 x=%.5f\ty=%.5f\t 精确值%.5f\t 误差%.5f\n',x,y,accuracy,abs(y-accuracy));
k1=fun(x,y);
k2=fun(x+h/2,y+k1*(h/2));
k3=fun(x+h/2,y+k2*(h/2));
k4=fun(x+h,y+k1*h);
y=y+h*(k1+k2+k3+k4)/4;
end
toc
2. 结果
欧拉法:
计算值 x=0.10000 y=0.00000 精确值 0.04877 误差 0.04877
计算值 x=0.20000 y=0.10000 精确值 0.18127 误差 0.08127
计算值 x=0.30000 y=0.28000 精确值 0.36237 误差 0.08237
计算值 x=0.40000 y=0.49600 精确值 0.55067 误差 0.05467
计算值 x=0.50000 y=0.69760 精确值 0.71350 误差 0.01590
计算值 x=0.60000 y=0.84880 精确值 0.83470 误差 0.01410
计算值 x=0.70000 y=0.93952 精确值 0.91371 误差 0.02581
计算值 x=0.80000 y=0.98186 精确值 0.95924 误差 0.02262
计算值 x=0.90000 y=0.99637 精确值 0.98258 误差 0.01379
计算值 x=1.00000 y=0.99964 精确值 0.99326 误差 0.00638
时间已过 0.011510 秒。
改进欧拉法:
计算值 x=0.10000 y=0.00000 精确值 0.04877 误差 0.04877
计算值 x=0.20000 y=0.14000 精确值 0.18127 误差 0.04127
计算值 x=0.30000 y=0.32920 精确值 0.36237 误差 0.03317
计算值 x=0.40000 y=0.52373 精确值 0.55067 误差 0.02694
计算值 x=0.50000 y=0.69043 精确值 0.71350 误差 0.02307
计算值 x=0.60000 y=0.81426 精确值 0.83470 误差 0.02045
计算值 x=0.70000 y=0.89598 精确值 0.91371 误差 0.01772
计算值 x=0.80000 y=0.94487 精确值 0.95924 误差 0.01437
计算值 x=0.90000 y=0.97188 精确值 0.98258 误差 0.01069
计算值 x=1.00000 y=0.98594 精确值 0.99326 误差 0.00732
时间已过 0.005725 秒。
龙格库塔方法:
计算值 x=0.10000 y=0.00000 精确值 0.04877 误差 0.04877
计算值 x=0.20000 y=0.14045 精确值 0.18127 误差 0.04082
计算值 x=0.30000 y=0.33103 精确值 0.36237 误差 0.03134
计算值 x=0.40000 y=0.52761 精确值 0.55067 误差 0.02306
计算值 x=0.50000 y=0.69637 精确值 0.71350 误差 0.01712
计算值 x=0.60000 y=0.82155 精确值 0.83470 误差 0.01315
计算值 x=0.70000 y=0.90351 精确值 0.91371 误差 0.01020
计算值 x=0.80000 y=0.95163 精确值 0.95924 误差 0.00761
计算值 x=0.90000 y=0.97730 精确值 0.98258 误差 0.00527
计算值 x=1.00000 y=0.98992 精确值 0.99326 误差 0.00334
时间已过 0.008043 秒。
比较结果,可以看出,R-K 方法精度最高,但是改进欧拉法速度最快
二、用改进欧拉法求习题 7.3
y`=-y
y(0)=1
1. 程序
fprintf('改进欧拉法:\n');
%求第一个点(x,y)的斜率k1和第二个点(x+h,y+K1*h)的斜率k2
y=1;
h=0.2;
for i=1:1/h
x=i*h;
accuracy=exp(-x);
y=0.82*y;
fprintf('计算值x=%.5f\ty=%.5f\t精确值%.5f\t误
差%.5f\n',x,y,accuracy,abs(y-accuracy));
end
2. 结果
改进欧拉法:
计算值 x=0.20000 y=0.82000 精确值 0.81873 误差 0.00127
计算值 x=0.40000 y=0.67240 精确值 0.67032 误差 0.00208
计算值 x=0.60000 y=0.55137 精确值 0.54881 误差 0.00256
计算值 x=0.80000 y=0.45212 精确值 0.44933 误差 0.00279
计算值 x=1.00000 y=0.37074 精确值 0.36788 误差 0.00286
三、用 R-K 求习题 7.6
y`=-y
y(0)=1
1. 程序
%7_6 精确函数 y=exp(-x)
h=0.2;
y=1;
for i=1:1/h
x=i*h;
accuracy=exp(-x);
y=(1-h+(h^2/2)-(h^3)/6+(h^4)/24)*y;
fprintf(' 计 算 值 x=%.5f\ty=%.10f\t 精 确 值 %.10f\t 误
差%.10f\n',x,y,accuracy,abs(y-accuracy));
end
2. 结果
计算值 x=0.20000 y=0.8187333333 精确值 0.8187307531 误差 0.0000025803
计算值 x=0.40000 y=0.6703242711 精确值 0.6703200460 误差 0.0000042251
计算值 x=0.60000 y=0.5488168249 精确值 0.5488116361 误差 0.0000051888
计算值 x=0.80000 y=0.4493346284 精确值 0.4493289641 误差 0.0000056643
计算值 x=1.00000 y=0.3678852381 精确值 0.3678794412 误差 0.0000057970
四、用 R-K 求实习题 7:1(1) y`=x^2+y^2
y(0)=0
1. 程序
y(0)=0
y`=x^2+y^2
%实习题 7_1(1)
fprintf('龙格库塔方法:\n');
h=0.1;
y=0;
for i=1:1/h
x=i*h;
fprintf('计算值 x=%.5f\ty=%.5f\n',x,y);
k1=fun1(x,y);
k2=fun1(x+h/2,y+k1*(h/2));
k3=fun1(x+h/2,y+k2*(h/2));
k4=fun1(x+h,y+k1*h);
y=y+h*(k1+k2+k3+k4)/4;
end
2. 结果
龙格库塔方法:
计算值 x=0.10000 y=0.00000
计算值 x=0.20000 y=0.00238
计算值 x=0.30000 y=0.00875
计算值 x=0.40000 y=0.02115
计算值 x=0.50000 y=0.04161
计算值 x=0.60000 y=0.07230
计算值 x=0.70000 y=0.11552
计算值 x=0.80000 y=0.17394
计算值 x=0.90000 y=0.25072
计算值 x=1.00000 y=0.34995
五、总结
刚开始没想好怎么下手,去网上查找了资料,发现程序很简单