矩阵与数值分析Word下载.docx

上传人:b****3 文档编号:7481049 上传时间:2023-05-08 格式:DOCX 页数:25 大小:147.53KB
下载 相关 举报
矩阵与数值分析Word下载.docx_第1页
第1页 / 共25页
矩阵与数值分析Word下载.docx_第2页
第2页 / 共25页
矩阵与数值分析Word下载.docx_第3页
第3页 / 共25页
矩阵与数值分析Word下载.docx_第4页
第4页 / 共25页
矩阵与数值分析Word下载.docx_第5页
第5页 / 共25页
矩阵与数值分析Word下载.docx_第6页
第6页 / 共25页
矩阵与数值分析Word下载.docx_第7页
第7页 / 共25页
矩阵与数值分析Word下载.docx_第8页
第8页 / 共25页
矩阵与数值分析Word下载.docx_第9页
第9页 / 共25页
矩阵与数值分析Word下载.docx_第10页
第10页 / 共25页
矩阵与数值分析Word下载.docx_第11页
第11页 / 共25页
矩阵与数值分析Word下载.docx_第12页
第12页 / 共25页
矩阵与数值分析Word下载.docx_第13页
第13页 / 共25页
矩阵与数值分析Word下载.docx_第14页
第14页 / 共25页
矩阵与数值分析Word下载.docx_第15页
第15页 / 共25页
矩阵与数值分析Word下载.docx_第16页
第16页 / 共25页
矩阵与数值分析Word下载.docx_第17页
第17页 / 共25页
矩阵与数值分析Word下载.docx_第18页
第18页 / 共25页
矩阵与数值分析Word下载.docx_第19页
第19页 / 共25页
矩阵与数值分析Word下载.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

矩阵与数值分析Word下载.docx

《矩阵与数值分析Word下载.docx》由会员分享,可在线阅读,更多相关《矩阵与数值分析Word下载.docx(25页珍藏版)》请在冰点文库上搜索。

矩阵与数值分析Word下载.docx

T(i,j)=2;

end

if(i==(j+1))

T(i,j)=-1;

if(i==(j-1))

I=eye(n-1);

k=1;

formm=1:

(n-1)

A(k:

(k+n-2),k:

(k+n-2))=T+2*I;

k=k+n-1;

forxx=1:

(n-2)

(k+n-2),(k+n-1):

(k+2*n-3))=-I;

A((k+n-1):

(k+2*n-3),k:

(k+n-2))=-I;

b=randn((n-1)^2,1);

x0=zeros((n-1)^2,1);

Jacobi迭代法Matlab程序如下:

functionn=jacobi(A,b,x0)

eps=1.0e-10;

M=10000;

D=diag(diag(A));

%求A的对角矩阵

L=-tril(A,-1);

%求A的下三角阵

U=-triu(A,1);

%求A的上三角阵

B=D\(L+U);

f=D\b;

x=B*x0+f;

n=1;

%迭代次数

whilenorm(x-x0)>

=eps

x0=x;

x=B*x0+f;

n=n+1;

if(n>

=M)

disp('

Warning:

迭代次数太多,可能不收敛!

'

);

return;

Gauss-Seidel迭代法Matlab程序如下:

functionn=gauseidel(A,b,x0)

G=(D-L)\U;

f=(D-L)\b;

x=G*x0+f;

x=G*x0+f;

[A,b,x0]=jz(10);

J10=jacobi(A,b,x0)

G10=gauseidel(A,b,x0)

[A,b,x0]=jz(20);

J20=jacobi(A,b,x0)

G20=gauseidel(A,b,x0)

[A,b,x0]=jz(30);

J30=jacobi(A,b,x0)

G30=gauseidel(A,b,x0)

J10=436;

G10=214

J20=1810;

G20=913

J30=3990;

G30=2001

N=10且M=1000时,Jacobi迭代法和Gauss—seidel迭代法的迭代次数分别为436和214;

N=20且M=1000时,Jacobi迭代法和Gauss—seidel迭代法的迭代次数分别为1810和913;

N=30且M=1000时,Jacobi和Gauss-seidel算法的迭代次数分别为3990和2001次。

从以上结果可知在该问题下Jacobi算法的收敛性没有Gauss-seidel算法的收敛性好,原因在于Jacobi算法迭代过程中,对已算出的信息未加充分利用,一般来说,后面计算的值要比前面的计算值要精确些,而Gauss-seidel算法则充分利用了已求出来的信息,所以此算法的收敛性更为好一些。

2.用Gauss列主元消去法、QR方法求解如下方程组:

Gauss列主元消去法Matlab程序如下:

function[x,XA]=GaussXQLineMain(A,b)

N=size(A);

n=N

(1);

index=0;

me=max(abs(A(1:

n,i)));

%选取列主元

fork=i:

n

if(abs(A(k,i))==me)

index=k;

%保存列主元所在的行

break;

temp=A(i,1:

n);

A(i,1:

n)=A(index,1:

A(index,1:

n)=temp;

bb=b(index);

b(index)=b(i);

b(i)=bb;

%交换主行

forj=(i+1):

if(A(i,i)==0)

对角元素为0!

l=A(j,i);

m=A(i,i);

A(j,1:

n)=A(j,1:

n)-l*A(i,1:

n)/m;

b(j)=b(j)-l*b(i)/m;

%消元

fori=n:

1

if(i<

n)

s=A(i,(i+1):

n)*x((i+1):

n,1);

else

s=0;

x(i,1)=(b(i)-s)/A(i,i);

end

XA=A;

QR法Matlab程序如下:

functionx=qrxq(A,b)

B=A;

%保存系数矩阵

A(1:

n,1)=A(1:

n,1)/norm(A(1:

n,1));

%将A的第一列正规化

fori=2:

(i-1)

A(1:

n,i)=A(1:

n,i)-dot(A(1:

n,i),A(1:

n,j))*A(1:

n,j);

%使A的第i列与前面所有的列正交

n,i)=A(1:

n,i)/norm(A(1:

n,i));

%将A的第i列正规化

Q=A;

%分解出来的正交矩阵

R=transpose(Q)*B;

bb=transpose(Q)*b;

s=R(i,(i+1):

x(i,1)=(bb(i)-s)/R(i,i);

A=[12-11;

2503;

1792;

8-1-21];

b=[0;

4;

12;

-8];

x_G=GaussXQLineMain(A,b)

x_QR=qrxq(A,b)

x_G=-1.00000000000000

-0.00000000000000

1.00000000000000

2.00000000000000

x_QR=-1.00000000000000

-0.00000000000001

1.00000000000000

2.00000000000002

三、非线性方程的迭代解法

1.求方程

的根,迭代停止的条件为:

使用弦截法求解此方程的根,弦截法的Matlab程序如下:

functionroot=Secant(f,a,b)

%f:

方程;

%a:

区间左端点;

%b:

区间右端点;

%root:

求得的根;

eps=1.0e-10;

f1=subs(sym(f),findsym(sym(f)),a);

f2=subs(sym(f),findsym(sym(f)),b);

if(f1==0)

root=a;

if(f2==0)

root=b;

if(f1*f2>

0)

两端点函数值乘积大于0!

else

tol=1;

fa=subs(sym(f),findsym(sym(f)),a);

fb=subs(sym(f),findsym(sym(f)),b);

root=a-(b-a)*fa/(fb-fa);

while(tol>

eps)

r1=root;

fx=subs(sym(f),findsym(sym(f)),r1);

s=fx*fa;

if(s==0)

root=r1;

if(s>

root=b-(r1-b)*fb/(fx-fb);

root=a-(r1-a)*fa/(fx-fa);

tol=abs(root-r1);

利用matlab的绘图功能可以确定求根区间为(1,3)

root=Secant('

exp(x)+2*x^2+2*sin(x)-log(x)-16'

1,3)

root=1.96292268316446

2.利用Newton迭代法求多项式

的所有实零点,注意重根的问题。

Newton迭代法的Matlab程序如下:

x=-3;

d=-1;

whileabs(d-x)>

0.5*10^(-8)%在区间(-3,-1)

d=x;

x=x-(x^4-3*x^3-3*x^2+11*x-6)/(4*x^3-9*x^2-6*x+11);

%牛顿法

x0=d

x=0;

d=2;

0.5*10^(-8)%在区间(0,2)的重根

x=x-2*(x^4-3*x^3-3*x^2+11*x-6)/(4*x^3-9*x^2-6*x+11);

x1=d

x=2.5;

d=4;

0.5*10^(-8)%在区间(2.5,4)

x2=d

x0=-2.00000000151233

x1=1.00000000065769

x2=3.00000000000002

由以上结果可知,newton迭代法所得结果与初始值的选取密切相关。

不同的初始值会产生不同的结果,甚至会影响牛顿迭代法收敛性。

四、数值积分

用三点Gauss型求积公式计算积分

n点Gauss型求积公式matlab程序如下:

functionI=question4(f,a,b,n)

%f为求积方程;

%a,b分别为积分上下限;

%n为Gauss点个数;

[XK,AK]=grule(n);

XK1=((b-a)/2)*XK+((a+b)/2);

I=((b-a)/2)*sum(AK.*subs(f,findsym(f),XK1));

function[bp,wf]=grule(n)

%[bp,wf]=grule(n)

bp=zeros(n,1);

wf=bp;

iter=2;

m=fix((n+1)/2);

e1=n*(n+1);

mm=4*m-1;

t=(pi/(4*n+2))*(3:

4:

mm);

nn=(1-(1-1/n)/(8*n*n));

xo=nn*cos(t);

forj=1:

iter

pkm1=1;

pk=xo;

fork=2:

t1=xo.*pk;

pkp1=t1-pkm1-(t1-pkm1)/k+t1;

pkm1=pk;

pk=pkp1;

den=1.-xo.*xo;

d1=n*(pkm1-xo.*pk);

dpn=d1./den;

d2pn=(2.*xo.*dpn-e1.*pk)./den;

d3pn=(4*xo.*d2pn+(2-e1).*dpn)./den;

d4pn=(6*xo.*d3pn+(6-e1).*d2pn)./den;

u=pk./dpn;

v=d2pn./dpn;

h=-u.*(1+(.5*u).*(v+u.*(v.*v-u.*d3pn./(3*dpn))));

p=pk+h.*(dpn+(.5*h).*(d2pn+(h/3).*(d3pn+.25*h.*d4pn)));

dp=dpn+h.*(d2pn+(.5*h).*(d3pn+h.*d4pn/3));

h=h-p./dp;

xo=xo+h;

bp=-xo-h;

fx=d1-h.*e1.*(pk+(h/2).*(dpn+(h/3).*(...

d2pn+(h/4).*(d3pn+(.2*h).*d4pn))));

wf=2*(1-bp.^2)./(fx.*fx);

if(m+m)>

n,bp(m)=0;

if~((m+m)==n),m=m-1;

jj=1:

m;

n1j=(n+1-jj);

bp(n1j)=-bp(jj);

wf(n1j)=wf(jj);

%end

symsx;

f=exp(-x);

a=0;

b=1;

n=3;

I=question4(f,a,b,n)

I=0.632120255664068

五、插值与逼近

1.给定

上的函数

,请做如下的插值逼近:

(1)构造等距节点分别取

的Lagrange插值多项式;

(2)取Chebyshev多项式

的零点:

作插值节点构造

的插值多项式

和上述的插值多项式均要求画出曲线图形(用不同的线型或颜色表示不同的曲线)。

(1)Lagrange插值matlab程序如下:

functionf=L1(n)

symsts;

q=1/(1+s^2);

x(i)=-1+2*(i-1)/(n-1);

y(i)=subs(q,s,x(i));

f=0.0;

for(i=1:

l=y(i);

for(j=1:

i-1)

l=l*(t-x(j))/(x(i)-x(j));

end;

for(j=i+1:

%计算拉格朗日基函数

f=f+l;

%计算拉格朗日插值函数

f=collect(f);

%化简

X=-1:

0.1:

1;

Y=subs(q,s,X);

F=subs(f,t,X);

plot(X,Y,'

g'

X,F,'

r'

f=collect(f);

%展开

digits(5);

f=vpa(f);

1、在matlab命令窗口中输入:

f=L1(5)

运行结果

2、在matlab命令窗口中输入:

f=L1(8)

3、在matlab命令窗口中输入:

f=L1(10)

由图像可以看出n=5时拟合曲线与原始曲线的误差比较大,而n=8,10时拟合曲线与原始曲线几乎重合在一起。

可见节点个越多,拉格朗日插值法所得的多项式曲线与原始曲线越接近,误差就越小。

的零点为插值点,此时Lagrange插值matlab程序主体基本不变,变的只是插值点,其程序如下:

functionf=L2(n)

x(i)=cos((2*i-1)*pi/2/n);

%计算拉格朗日插值函数

%绘图

k'

rp'

f=L2(10)

有图像比较可以看出,N=10时,chebyshev零为拉格朗日插值时,其拟合曲线与原始曲线几乎重合,精度较高。

2.已知函数值

3

4

6

和边界条件:

. 求三次样条插值函数

并画出其图形.

三次样条插值matlab程序如下:

functionThrSample1(x,y,y_1,y_N)

symst;

if(length(x)==length(y))

n=length(x);

x和y的维数不相等!

end%维数检查

A=diag(2*ones(1,n));

%求解m的系数矩阵

u=zeros(n-2,1);

lamda=zeros(n-1,1);

c=zeros(n,1);

u(i-1)=(x(i)-x(i-1))/(x(i+1)-x(i-1));

lamda(i)=(x(i+1)-x(i))/(x(i+1)-x(i-1));

c(i)=3*lamda(i)*(y(i)-y(i-1))/(x(i)-x(i-1))+...

3*u(i-1)*(y(i+1)-y(i))/(x(i+1)-x(i));

A(i,i+1)=u(i-1);

A(i,i-1)=lamda(i);

%形成系数矩阵及向量c

c

(1)=2*y_1;

c(n)=2*y_N;

m=followup(A,c);

%用追赶法求解方程组

j=1;

whilej<

=n-1

h=x(j+1)-x(j);

f=y(j)*(2*(t-x(j))+h)*(t-x(j+1))^2/h^3+...

y(j+1)*(2*(x(j+1)-t)+h)*(t-x(j))^2/h^3+...

m(j)*(t-x(j))*(x(j+1)-t)^2/h^2-...

m(j+1)*(x(j+1)-t)*(t-x(j))^2/h^2;

fprintf('

当x属于[%d,%d],f=\n'

x(j),x(j+1));

disp(f);

X=x(j):

x(j+1);

F=subs(f,t,X);

plot(X,F,'

holdon;

j=j+1;

functionx=followup(A,b)

n=rank(A);

for(i=1:

Error:

对角有元素为0!

end;

d=ones(n,1);

a=ones(n-1,1);

c=ones(n-1);

n-1)

a(i,1)=A(i+1,i);

c(i,1)=A(i,i+1);

d(i,1)=A(i,i);

d(n,1)=A(n,n);

for(i=2:

n)

d(i,1)=d(i,1)-(a(i-1,1)/d(i-1,1))*c(i-1,1);

b(i,1)=b(i,1)-(a(i-1,1)/d(i-1,1))*b(i-1,1);

x(n,1)=b(n,1)/d(n,1);

for(i=(n-1):

1)

x(i,1)=(b(i,1)-c(i,1)*x(i+1,1))/d(i,1);

x=[346];

y=[602];

y_1=1;

y_N=-1;

ThrSample1(x,y,y_1,y_N)

由图像可以看出三次样条插值曲线的优越性,即光滑性好,收敛得到保证,局部性好。

3.观察物体的直线运动,得到如下数据

时刻t

0.9

1.9

3.0

3.9

5.0

位移s

10

30

51

80

111

求运动学方程

matlab程序如下:

t=[00.91.93.03.95.0];

s=[010305180111];

n=length(t);

a2=0;

a2=t(i)^2+a2;

a3=0;

a3=t(i)^3+a3;

a4=0;

a4=t(i)^4+a4;

b1=0;

b1=s(i).*t(i)+b1;

b2=0;

b2=s(i).*(t(i).^2)+b2;

A=[a2a3;

a3a4]

b=[b1;

b2]

c=inv(A)*b

x=0:

0.01:

5.0;

y=c

(1).*x+c(

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2