数值分析matlab程序

  • 格式:doc
  • 大小:785.50 KB
  • 文档页数:46

数值分析(matlab程序)

曹德欣 曹璎珞

第一章 绪论

数值稳定性程序,计算P11 试验题一积分

function try_stable

global n

global a

a=input('a=');

N = 20;

I0 = log(1+a)-log(a);

I = zeros(N,1);

I(1) = -a*I0+1;

for k = 2:N

I(k) = - a*I(k-1)+1/k;

end

II = zeros(N,1);

if a>=N/(N+1)

II(N) = (1+2*a)/(2*a*(a+1)*(N+1));

else

II(N) =(1/((a+1)*(N+1))+1/N)/2;

end

for k = N:-1:2

II(k-1) = ( - II(k) +1/k) / a;

end

III = zeros(N,1);

for k = 1:N

n = k;

III(k) = quadl(@f,0,1);

end

clc

fprintf('\n 算法1结果 算法2结果 精确值')

for k = 1:N,

fprintf('\nI(%2.0f) %17.7f %17.7f %17.7f',k,I(k),II(k),III(k))

end

function y = f(x)

global n

global a

y = x.^n./(a+x);

return 第二章 非线性方程求解

下面均以方程y=x^4+2*x^2-x-3为例:

1、二分法

function y=erfen(a,b,esp)

format long

if nargin<3 esp=1.0e-4;

end

if fun(a)*fun(b)<0

n=1;

c=(a+b)/2;

while c>esp

if fun(a)*fun(c)<0

b=c;

c=(a+b)/2;

elseif fun(c)*fun(b)<0

a=c;

c=(a+b)/2;

else y=c; esp=10000;

end

n=n+1;

end

y=c;

elseif fun(a)==0

y=a;

elseif fun(b)==0

y=b;

else disp('these,nay not be a root in the intercal')

end

n

function y=fun(x)

y=x^4+2*x^2-x-3;

2、牛顿法

function y=newton(x0)

x1=x0-fun(x0)/dfun(x0);

n=1;

while (abs(x1-x0)>=1.0e-4) & (n<=100000000)

x0=x1;

x1=x0-fun(x0)/dfun(x0);

n=n+1;

end

y=x1

n

function y=fun(x) y=x^4+2*x^2-x-3;

3、割线法

function y=gexian(x0,x1)

x2=x1-fun(x1)*(x1-x0)/(fun(x1)-fun(x0)); %根据初始XO和X1求X2

n=1;

while (abs(x1-x0)>=1.0e-4) & (n<=100000000) %判断两个条件截止

x0=x1; %将x1赋给x0

x1=x2; %将x2赋给x1

x2=x1-fun(x1)*(x1-x0)/(fun(x1)-fun(x0)); %迭代运算

n=n+1;

end

y=x2

n

function y=fun(x)

y=x^4+2*x^2-x-3;

第四章

题目:推导外推样条公式:1232123211223322~~~~~22~nnnnnnnnddddMMMM,并编写程序与Matlab的Spline函数结果进行对比,最后调用追赶法解方程组。

解:设()sx的二阶导数值''()(0,1,,)iisxMin,因为()sx在1,iixx上是三次多项式,所以''()isx在1,iixx上是一次多项式,且可表示为

''11()iiiiiiixxxxsxMMhh (1)

对式(1)进行两次积分可得:

33111()()()()()66kkkkkkkkkkkMMsxxxxxPxxQxxhh (2)

由式(2)根据()kkysx和11()kkysx可得系数为: 6kkkkkymhPh,116kkkkkymhQh (3)

将式(3)代入式(2)可得()sx为:

3311111()()()()()()()6666kkkkkkkkkkkkkkkkkMMymhymhsxxxxxxxxxhhhh

分别对()kksx和1()kksx进行求导,并根据两者相等整理得:

112kkkkkkMMMd (4)

其中,11kkkkhhh,1kkkkhhh,11116()kkkkkkkkkyyyydhhhh

但是要解给定的方程组,还需要两个另外的条件,而外推样条插值的条件可通过下面推理得出:令式(1)中的x等于1x,可得:

32112122()MMMhhhhh (5)

1212122()()nnnnnnnnMMMhhhhh (6)

令式(4)中2k,然后将式(5)代入得:

1123222(2)(1)hhMMdhh (7)

令式(4)中1kn,然后将式(6)代入得:

1112122(2)(1)nnnnnnnhhMMdhh (8)

将方程组(4)和式(7)、式(8)联立展开即得题目所求。

按照推导出的外推样条插值公式编程可得如下M文件(spline_wt.m)

function spline_wt

X=[0 1 2 3 4 5];

Y=[0 0.5 2 1.5 3.5 1.9];

% 调用自编程序

S = spline_w(X,Y);

%调用matlab提供程序

S1=spline(X,Y);

fnplt(S,'r',2); % 作图

hold on

fnplt(S1,'b',1); hold on

plot(X,Y,'or'); % 画上节点

title('红线为自编程序曲线,蓝线为自带程序曲线')

% pp的第j行表示第j个三次多项式的4系数并写出分段多项式

pp = S.coefs

P1 = poly2str(pp(1,:),'(x-0)')

P2 = poly2str(pp(2,:),'(x-1)')

P3 = poly2str(pp(3,:),'(x-2)')

ppp=S1.coefs

PP1 = poly2str(ppp(1,:),'(x-0)')

PP2 = poly2str(ppp(2,:),'(x-1)')

PP3 = poly2str(ppp(3,:),'(x-2)')

function sp = spline_w(X,Y)n = length(X);

h = diff(X);

d = diff(Y)./h;

d1(2:n-1)=6*diff(d)./(h(1:n-2)+h(2:n-1));

mu(2:n-1)=h(1:n-2)./(h(1:n-2)+h(2:n-1));

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

la(2:n-1)=1-mu(2:n-1);

la(2)=1-h(1)/h(2);

% 计算三对角方程组

a = mu(3:n-1);

b = 2*ones(n-2,1);

b(1)=2+h(1)/h(2);

b(n-2)=2+h(n-2)/h(n-1);

c = la(2:n-2);

u(1:n-2) = d1(2:n-1);

% 调用追赶法解方程组

M(2:n-1) = tridiag(a,b,c,u); M(1)=(1+h(1)/h(2))*M(2)-M(3)*h(1)/h(2);

M(n)=(1+h(n-1)/h(n-2))*M(n-1)-M(n-2)*h(n-1)/h(n-2);

% 下面计算分段多项式的四个系数

S=zeros(n-1,4);

for k=0:n-2

S(k+1,1)=(M(k+2)-M(k+1))/(6*h(k+1));S(k+1,2)=M(k+1)/2;

S(k+1,3)=d(k+1)-h(k+1)*(2*M(k+1)+M(k+2))/6;

S(k+1,4)=Y(k+1);

end

sp = mkpp(X,S);%转换成 Matlab 格式