数值计算方法上机实习题

数值计算方法上机实习题
数值计算方法上机实习题

数值计算方法上机实习题

1 1

(2)丨20=0, 120 = 10000,用 I n 」

I n 」 一,计算丨0 ; 5 5n

答:第一个算法可得出

易知第一个算法每一步计算都把误差放大了

5倍,n 次计算后更是放大了 5n

倍,可靠性低。

第二个算法可得出

(1 )

由递推公式I n = -51心-,从

n

I o =O.1823出发,计算* ;

(3)

分析结果的可靠性及产生此现象的原因

重点分析原因。

可以看出第二个算法每一步计算就把误差缩小5倍,n次后缩小了5n倍,可靠性高。

2.求方程e^+IOx —2=0的近似根,要求 x k *—x k <^10-,并比较计算量。

(1)

在[0 , 1]上用二分法;

(1) [0, 1]上的二分法

二分法子程序:

function [root,n]=EFF3(f,x1,x2) %第二题⑴二分法

f1= subs(f,symvar(f),x1);% 函数在 x=x1 的值 f2=subs(f,symvar(f),x2);%x=x2 n=0;%步数 er=5*10A-4;% 误差 if(f1==0)

root=x1; return;

elseif(f2==0)

root=x2; return;

elseif(f1*f2>0)

disp('两端点函数值乘积大于 0!');

return;

else

while(abs(x1-x2)>er)% 循环 x3=(x1+x2)/2;

f3=subs(f,symvar(f),x3);

n=n+1; if(f3==0)

root=x3; break; elseif(f1*f3>0)

x1=x3; else

x2=x3; end end

root=(x1+x2)/2;%while 循环少一步需加上 end

2 _e (2) 取初值x 0 =0,并用迭代x k d :

10

(2)初值x o =O 迭代

计算根与步数程序:

迭代法子程序:

syms x;

function [root,n]=DDF(g,x0,err,max) (接下页) f=(2-exp(x))/10;(接下页)

计算根与步数程序:

fplot(@(x) exp(x)+10*x-2,[0,1]); grid on; syms x; f=exp(x)+10*x-2; [root,n]=EFF3(f,0,1);

fprintf('root=%6.8f ,n=%d \n',root,n);

计算结果显示:

root=0.09057617 ,n=11

(3)加速迭代的结果

(4)取初值X。=0,并用牛顿迭代法;

(5)分析绝对误差。

答:可以看到,在同一精度下,二分法运算了11次,题设迭代算式下运算了4次,加速迭代下运算了2次,牛顿迭代下运算了2次。因不动点迭代法和二分法都是线性收敛的,但二分法压缩系数比题设迭代方法大,收敛速度较慢。加速迭代速度是超线性收敛,牛顿法是二阶,收敛速度快。

3.钢水包使用次数多以后,钢包的容积增大,数据如下:

ax + b

试从中找出使用次数和容积之间的关系,计算均方差。(用y 拟合)

c + x

拟合曲线程序:

x=2:16;

y=[6.42 8.2 9.58 9.5 9.7 10 9.93 9.99 10.49 10.59

10.60 10.8 10.6 10.9 10.76];

[f,fval]=fminsearch(@delta1,[0,0,0],optimset,x,y)

J

%fminsearch为求解多元函数的最小值函数

%f为多元函数初值x0附近的极小值点

%fval为极小值

k=2:100;

y1= (f(1).*k+f(2))./(f(3)+k); figure1=figure('Color',[1 1 1]);

gxt=plot(x,y,'xr',k,y1,'k-');

legend(原数据’,'拟合曲线','Location','northwest'); %y 为数据点连接曲线,y1为拟合曲线

title('函数y=(ax+b)/(x+c)的拟合

','FontSize',14,'FontWeight','Bold'); xlabel('次数

','FontSize',14,'FontWeight','Bold'); ylabel('容积

','FontSize',14,'FontWeight','Bold');

set(gxt,'LineWidth',1.5);

grid on;

%计算均方差

for i=1:15 构造函数子程序:

function delta=delta1(f,x,y)

a=f(1);

b=f(2);

c=f(3);

delta=0;

for k=1:15

delta=delta+((x(k)+c)*y(k)-(a*x(k)+b))A2;

end

计算结果显示:

拟合出的方程为:(x+-0.7110)y=11.2657x+-15.5024

均方差为033165089

总结:

指标选择,因题设方程I & E需[片—签普「为非线性的,要转化为线性方程故需提指标为:

y2(i)=(f(1).*x(i)+f(2))./(f(3)+x(i)); (接下页)

end j=0; for i=1:15

j=i+(y(i)-y2(i))A

2; end

jfc=sqrt(j/15);

fprintf('拟合出的方程

为:(x+%4.4f)y=%4.4fx+%4.4f \n 均方差 为:%4.8f \n',f(3),f(1),f(2),jfc);

i=i

亦2

+ l)y£— oxf - 力]二

1=1

(cx^-i)y=ax+b f l= J-jJfcXj +1)给一叫 一 b] 其驻点

方程为:

、亠

£ =》2[宓+Dyj-oXi- >](-%!)= 0;

i=i

计算结果显示:

12

6

10

9

8

0 10 20 30 40 50 60 70 80 90 100

次数

『4

-1 0 -1 0 0、

『0、

-1 4 -1 0 -1 0

5

0 -1 4 -1 0 -1 ,b = -2 -1 0 -1 4 -1 0

5

0 -1 0 -1 4 -1

-2 1° 0 -1 0 -1 4」

3」

(1) JACOBI 迭代;

(2) GAUSS-SEIDEL 迭代;

分析下列迭代法的收敛性,并求

X

k 1 -x

k

<10^的近似解及相应的迭代次数。

(3)SOR迭代(取=0.1:0.1:1.9,找到迭代步数最少的* )。

逆幕迭代法子程序:

function [lamda,V ,k]=NMSF2(A,v,eps,p) [n,n]=size(A); A=A-p*eye( n); v0=v;

[tmax,tindex]=max(abs(v0)); lamd0=v0(tindex); u0=v0/lamd0; flag=0; k=0;

while(flag==0)

V=A\u0;

[tmax,tindex]=max(abs(V)); lamd1=V(tindex); u0=V/lamd1;

if (abs((lamd0)A(-1)-(lamd1)A(-1)))v=eps flag=1; end

lamd0=lamd1; k=k+1;

end (接下页) lamda=(lamd1)A(-1)+p; V=u0';

逆幕迭代计算程序:

A=[6 3 1;3 2 1;1 1 1]; v=[1 1 1]'; eps=0.001; p=11;

[lamda,U,k]=NMSF2(A,v,eps,p);

fprintf('最接近11的特征值为:%4.8f\n 特征向量: \n%4.8f\n %4.8f\n%4.8f\n',lamda,U(1),U(2),U(3));

计算结果显示:

最接近于11的特征值为:7.87313712 特征向量:

1.00000000 0.54922698 0.22545618

6.用经典R-K 方法求解初值问题

"6 3

r

5?用逆幕迭代法求 A =

3 2 1 最接近于

1 1 1

11的特征值和特征向量,准确到

10’。

'y; = _2y

”2 = yi —2y2 +2cosx—2sin x

和精确解丿y i(x) =2e」Minx比较,进行误差分析

得到结论,图形显示精确解和数值解。y2(x) = 2e? +cosx

经典四阶R-K方法

R-K程序:

f=@(x,y)

[-2*y(1)+y(2)+2*sin(x);y(1)-2*y(2)+2*cos(x)-2*sin(x)];

g=@(x,y)【-2*y(1)+y(2)+2*sin(x);998*y(1)-999*y(2)+

999*cos(x)-999*sin(x)]; (接下页)

x=0:0.1:10;

Y1= 2*exp(-x)+sin(x);

Y2=2*exp(-x)+cos(x);

x仁0:10/10000:10;

Y3=2*exp(-x1)+sin(x1);

Y4=2*exp(-x1)+cos(x1);

N=100;N 1=10000;

[a1,b1]=ode23(f,[0:0.1:10],[2 3]);

[a2,b2]=ode23(g,[0:1/1000:10],[2 3]);

[a3,b3]=ode45(f,[0:0.1:10],[2 3]);

[a4,b4]=ode45(g,[0:1/1000:10],[2 3]);

n=length(b1);

figure1=figure('Color',[1 1 1]);

dbt=plot(x,b1(:,1),'r-',x,b1(:,2),'k-',x,Y1,'g--',x,Y2,'y--'); legend('y1','y2','精确解Y1','精确解Y2');

title('四阶RK算法下的方程组的数值解&方程的精确

解','FontSize',14,'FontWeight','Bold');

ylabel( Y,'FontSize',14,'FontWeight','Bold');

xlabel('X','FontSize',14,'FontWeight','Bold');

set(dbt,'LineWidth',1.5);grid on;

Q=b1(:,1)-Y1';W=b1(:,2)-Y2';

Q1= b2(:,1)-Y3';W 仁b2(:,2)-Y4';

Q2=b3(:,1)-Y1';W2=b3(:,2)-Y2';

Q3=b4(:,1)-Y3';W3=b4(:,2)-Y4';

ER1=max(abs(Q));ER2=max(abs(W));

ER3=max(abs(Q1));ER4=max(abs(W1));

fprintf('\n (1)中y1在ode23下求出的最大误差

为:%4.8f\n( 1 )中y2在ode23下求出的最大误差

为:%4.8f\n',ER1,ER2);

fprintf('\n (2)中y1在ode23下求出的最大误差

为:%4.8f\n(2)中y2在ode23下求出的最大误差

为:%4.8f\n',ER3,ER4);

fprintf('\n (1)中y1在ode45下求出的最大误差

为:%4.8f\n ( 1 )中y2在ode45下求出的最大误差

为:%4.8f\n',ER5,ER6);

fprintf('\n (2)中y1在ode45下求出的最大误差

为:%4.8f\n(2)中y2在ode45下求出的最大误差

为:%4.8f\n',ER7,ER8);

计算与显示程序:

(1 )中y1在ode23下求出的最大误差为:

0.00169850

(1 )中y2在ode23下求出的最大误差为:

0.00207422

(2)中y1在ode23下求出的最大误差为:

0.00000583

(2)中y2在ode23下求出的最大误差为:

0.00581329

(1 )中y1在ode45下求出的最大误差为:

0.00052155

(1 )中y2在ode45下求出的最大误差为:

0.00045793

(2)中y1在ode45下求出的最大误差为:

0.00000276

(2)中y2在ode45下求出的最大误差为:

0.00275331

总结:

对比2种方程在ode23,ode45命令下,与精确值的误差可以发现,在此题中,ode45的误差相对

于ode23的误差小,较适合用在此类钢性问题中。

x [0,10], 伙

0) = 2

y

2 (0) = 3

f F y i --2y1 y2 2sin x

= 998y1 -999y2 999cosx -999sinx

x [0,10],

"(0) = 2

y2(0)=3°

ER7=max(abs(Q3));ER8=max(abs(W3));

计算结果显示:

(1) Ode 23 的题1

四阶良K算法卜的方程组的数值解&方程的粘确解

四阶RK算法下的方程组的数值鞄方程的精确解

(3) Ode 45 的题1

四阶RK篦法Z的方程组的数值解&方程的秸确解

7?用有限差分法求解边值问题(h=0.1),并图形显示。

y”_(1 +X2)y =0

y(_1) = y(1)=1

有限差分法子程序:

function y=YXCFF_D(h)

n=(1-(-1))/h;

x(1)=-1;

for i=1:n-1 % n-1

x(i)=x(1)+(i-1)*h;

q(i)=(1+x(V2);

B(i)=2/(h A2)+q(i);

end

for i=1:n-2 % n-2

C(i)=-1/(hA2);

end

b(1)=0+1/(hA2);

b(n-1)=0+1/(hA2);

for i=2:n-2

b(i)=0;

end

b=b';% n-1

u(1)=b(1)/B(1);

v(1)=C(1)/B(1);

for k=2:n-2;

u(k)=(b(k)-u(k-1)*C(k-1))/(B(k)-v(k-1)*C(k-1)); v(k)=C(k)/(B(k)-v(k-

1)*C(k-1));

end

u( n-1)=(b( n-1)-u( n-2)*C( n-2))/(B( n-1)-v( n-2)*C( n-2)); V(n-1)=u(n-1); for k=n-2:-1:1

V(k)=u(k)-v(k)*V(k+1);

end

y=[1,V,1]; 计算与显示程序:

h=0.0001;

h1=0.1;

L=YXCFF_D(h);

L仁YXCFF_D(h1);

X=-1:h:1;

X仁-1:h1:1;

figure1=figure('Color',[1 1 1]);

gxt=plot(X,L,'k-',X1,L1,'r-');

title(' 有限差分法','FontSize',14,'FontWeight','Bold');

xlabel(' 输入值x','FontSize',14,'FontWeight','Bold');

ylabel('值y','FontSize',14,'FontWeight','Bold'); set(gxt,'LineWidth',1.5);

grid on;

总结:

对比两个步长下,求边值问题,步长小,越精确。

有限差分法

相关主题