MATLAB源代码.docx

上传人:b****5 文档编号:6059462 上传时间:2023-01-03 格式:DOCX 页数:37 大小:23.33KB
下载 相关 举报
MATLAB源代码.docx_第1页
第1页 / 共37页
MATLAB源代码.docx_第2页
第2页 / 共37页
MATLAB源代码.docx_第3页
第3页 / 共37页
MATLAB源代码.docx_第4页
第4页 / 共37页
MATLAB源代码.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

MATLAB源代码.docx

《MATLAB源代码.docx》由会员分享,可在线阅读,更多相关《MATLAB源代码.docx(37页珍藏版)》请在冰豆网上搜索。

MATLAB源代码.docx

MATLAB源代码

埃特金插值

functionf=Atken(x,y,x0)

symst;

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

n=length(x);

else

disp;

return;

end

y1(1:

n)=t;

for(i=1:

n-1)

for(j=i+1:

n)

y1(j)=y(j)*(t-x(i))/(x(j)-x(i))+y(i)*(t-x(j))/(x(i)-x(j));

end

y=y1

simplify(y1);

end

if(nargin==3)

f=subs(y1(n),'t',x0);

else

simplify(y1(n));

f=collect(y1(n));

f=vpa(f,6);

end

特征多项式法

functionl=Chapoly(A)

%特征多项式法求矩阵特征值

%已知矩阵:

A

%求得的矩阵特征值:

l

symst;

N=size(A);

n=N(1,1);

y=det(A-t*eye(n,n));

l=solve(y);

l=vpa(1,5);%

functionf=Chebyshev(y,k,x0)

symst;

T(1:

k+1)=t;

T

(1)=1;

T

(2)=t;

c(1:

k+1)=0.0;

c

(1)=int(subs(y,findsym(sym(y)),sym('t'))*T

(1)/sqrt(1-t^2),t,-1,1)/pi;

c

(2)=2*int(subs(y,findsym(sym(y)),sym('t'))*T

(2)/sqrt(1-t^2),t,-1,1)/pi;

f=c

(1)+c

(2)*t;

fori=3:

k+1

T(i)=2*t*T(i-1)-T(i-2);

c(i)=2*int(subs(y,findsym(sym(y)),sym('t'))*T(i)/sqrt(1-t^2),t,-1,1)/2;

f=f+c(i)*T(i);

f=vpa(f,6);

if(i==k+1)

if(nargin==3)

f=subs(f,'t',x0);

else

f=vpa(f,6);

end

end

end

弦割法求解非线性方程

function[xkt]=ChordsecantToEquation(f,x0,x1,eps)

%弦割法求解非线性方程

%[xkt]=ChordsecantToEquation(f,x0,x1,eps)

%x:

近似解

%k:

迭代次数

%t:

运算时间

%f:

原函数,定义为内联函数

%x0,x1:

初始值

%eps:

误差限

%

%应用举例:

%f=inline('x^3+4*x^2-10');

%x=ChordsecantToEquation(f,1,2,0.5e-6)

%[xk]=ChordsecantToEquation(f,1,2,0.5e-6)

%[xkt]=ChordsecantToEquation(f,1,2,0.5e-6)

%函数的最后一个参数也可以不写,默认情况下,eps=0.5e-6

%[xkt]=ChordsecantToEquation(f,1,2)

ifnargin==3

eps=0.5e-6;

end

tic;

k=0;

while1

x=x1-f(x1)*(x1-x0)./(f(x1)-f(x0));

k=k+1;

ifabs(x-x1)30

break;

end

x0=x1;

x1=x;

end

t=toc;

ifk>=30

disp('迭代次数太多。

');

x=0;

t=0;

end

复合求积公式

function[I,step]=CombineTraprl(f,a,b,eps)

%f被积函数

%a,b积分上下限

%eps精度

%I积分结果

%step积分的子区间数

if(nargin==3)

eps=1.0e-4;

end

n=1;

h=(b-a)/2;

I1=0;

I2=(subs(sym(f),findsym(sym(f)),a)+subs(sym(f),findsym(sym(f)),b))/h;

whileabs(I2-I1)>eps

n=n+1;

h=(b-a)/n;

I1=I2;

I2=0;

fori=0:

n-1

x=a+h*i;

x1=x+h;

I2=I2+(h/2)*(subs(sym(f),findsym(sym(f)),x)+subs(sym(f),findsym(sym(f)),x1));

end

end

I=I2;

step=n;

functionf=DCS(x,y,x0)

symst;

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

n=length(x);

c(1:

n)=0.0;

else

disp('x和y的维数不相等!

');

return;

end

c

(1)=y

(1);

for(i=1:

n-1)

for(j=i+1:

n)

y1(j)=(x(j)-x(i))/(y(j)-y(i));

end

c(i+1)=y1(i+1);

y=y1;

end

f=c(n);

for(i=1:

n-1)

f=c(n-i)+(t-x(n-i))/f;

f=vpa(f,6);

if(i==n-1)

if(nargin==3)

f=subs(f,'t',x0);

else

f=vpa(f,6);

end

end

end;

用欧拉法求一阶常微分方程的数值解

functiony=DEEuler(f,h,a,b,y0,varvec)

formatlong;

N=(b-a)/h;

y=zeros(N+1,1);

x=a:

h:

b;

y

(1)=y0;

fori=2:

N+1

y(i)=y(i-1)+h*Funval(f,varvec,[x(i-1),y(i-1)]);

end

formatshort;

用隐式欧拉法求一阶常微分方程的数值解

functiony=DEimpEuler(f,h,a,b,y0,varvec)

formatlong;

N=(b-a)/h;

y=zeros(N+1,1);

y

(1)=y0;

x=a:

h:

b;

var=findsym(f);

fori=2:

N+1

fx=Funval(f,var

(1),x(i));

gx=y(i-1)+h*fx-varvec

(2);

y(i)=NewtonRoot(gx,-10,10,eps);

end

formatshort;

龙格库塔法

functiony=DELGKT2_suen(f,h,a,b,y0,varvec)

formatlong;

N=uint16((b-a)/h);

y=zeros(N+1,1);

y

(1)=y0;

x=a:

h:

b;

var=findsym(f);

fori=2:

N+1

K1=Funval(f,varvec,[x(i-1)y(i-1)]);

K2=Funval(f,varvec,[x(i-1)+2*h/3y(i-1)+K1*2*h/3]);

y(i)=y(i-1)+h*(K1+3*K2)/4;

end

formatshort;...

用改进欧拉法求一阶常微分方程的数值解

functiony=DEModifEuler(f,h,a,b,y0,varvec)

formatlong;

N=(b-a)/h;

y=zeros(N+1,1);

y

(1)=y0;

x=a:

h:

b;

var=findsym(f);

fori=2:

N+1

v1=Funval(f,varvec,[x(i-1)y(i-1)]);

t=y(i-1)+h*v1;

v2=Funval(f,varvec,[x(i)t]);

y(i)=y(i-1)+h*(v1+v2)/2;

end

formatshort;

一阶微分方程

Functiondy=myfun_1(x,y)%定义输入,输出变量和函数文件名

dy=zeros(2,1);%明确dy的维数,用微分方程组时不可缺省

dy

(1)=y

(2);%dy(m)表示y的m阶导数;y(n)表示y的第n列

dy

(2)=2*y

(2)-2*y

(1)+5*exp(2*x)*sin(x);%与方程组中第二个微分方程对应

基本Guass消去法求解线性方程组

functionx=EqtsBasicGuass(A,b)

%基本Guass消去法求解线性方程组Ax=b

%x=EqtsBasicGuass(A,b)

%x:

解向量,列向量

%A:

线性方程组的矩阵

%b:

列向量

%

%检查输入参数

ifsize(A,1)~=size(b,1)

disp('输入参数有误!

');

x='';

return;

end

%(A|b)

A=[Ab];

%消去过程

n=size(A,1);

l=zeros(n);

fork=1:

n-1

fori=k+1:

n

l(i,k)=A(i,k)/A(k,k);

end

fori=k+1:

n

forj=k+1:

n+1

A(i,j)=A(i,j)-l(i,k)*A(k,j);

end

forj=1:

k

A(i,j)=0;

end

end

end

%回代过程

x=zeros(n,1);

x(n)=A(n,n+1)/A(n,n);

fori=n-1:

-1:

1

y=0;

forj=i+1:

n

y=y+A(i,j)*x(j);

end

x(i)=(A(i,n+1)-y)/A(i,i);

end

return;

追赶法求解三对角线性方程组

functionx=EqtsForwardAndBackward(L,D,U,b)

%追赶法求解三对角线性方程组Ax=b

%x=EqtsForwardAndBackward(L,D,U,b)

%x:

三对角线性方程组的解

%L:

三对角矩阵的下对角线,行向量

%D:

三对角矩阵的对角线,行向量

%U:

三对角矩阵的上对角线,行向量

%b:

线性方程组Ax=b中的b,列向量

%

%应用举例:

%L=[-1-2-3];D=[2345];U=[-1-2-3];b=[61-21]';

%x=EqtsForwardAndBackward(L,D,U,b)

%检查参数的输入是否正确

n=length(D);m=length(b);

n1=length(L);n2=length(U);

ifn-n1~=1||n-n2~=1||n~=m

disp('输入参数有误!

')

x='';

return;

end

%追的过程

fori=2:

n

L(i-1)=L(i-1)/D(i-1);

D(i)=D(i)-L(i-1)*U(i-1);

end

x=zeros(n,1);

x

(1)=b

(1);

fori=2:

n

x(i)=b(i)-L(i-1)*x(i-1);

end

%赶的过程

x(n)=x(n)/D(n);

fori=n-1:

-1:

1

x(i)=(x(i)-U(i)*x(i+1))/D(i);

end

return;

Guass-Seidel迭代法

function[xk]=EqtsGS(A,b,x0,eps)

%Guass-Seidel迭代法求解线性方程组Ax=b

%[xk]=EqtsGS(A,b,x0,eps)

%x:

解向量,列向量

%k:

迭代次数

%A:

系数矩阵

%b:

列向量

%x0:

迭代初始值,列向量

%eps:

误差限,可缺省,缺省值为0.5e-6

%

%应用举例:

%A=[1031;2-103;1310];b=[14;-5;14];x0=[0;0;0];

%[xk]=EqtsGS(A,b,x0,0.5e-6)

%x=EqtsGS(A,b,x0)

ifnargin==3

eps=0.5e-6;

end

%检查输入参数

n=length(b);

ifsize(A,1)~=n||n~=length(x0)

disp('输入参数有误!

');

x='';

k='';

return;

end

%迭代求解

k=0;

x=zeros(n,1);

while1

k=k+1;

fori=1:

n

z=0;

forj=1:

i-1

z=z+A(i,j)*x(j);

end

forj=i+1:

n

z=z+A(i,j)*x0(j);

end

x(i)=(b(i)-z)/A(i,i);

end

ifnorm(x-x0)<=eps||k>30

break;

end

x0=x;

end

ifk>=30

disp('迭代次数太多!

')

x='';

return;

end

return;

Jacobi迭代法求解线性方程组

function[xk]=EqtsJacobi(A,b,x0,eps)

%Jacobi迭代法求解线性方程组Ax=b

%[xk]=EqtsJacobi(A,b,x0,eps)

%x:

解向量,列向量

%k:

迭代次数

%A:

系数矩阵

%b:

列向量

%x0:

迭代初始值,列向量

%eps:

误差限,可缺省,缺省值为0.5e-6

%

%应用举例:

%A=[1031;2-103;1310];b=[14;-5;14];x0=[0;0;0];

%[xk]=EqtsJacobi(A,b,x0,0.5e-6)

%x=EqtsJacobi(A,b,x0)

ifnargin==3

eps=0.5e-6;

end

%检查输入参数

n=length(b);

ifsize(A,1)~=n||n~=length(x0)

disp('输入参数有误!

');

x='';

k='';

return;

end

%迭代求解

k=0;

x=zeros(n,1);

while1

k=k+1;

fori=1:

n

z=0;

forj=1:

i-1

z=z+A(i,j)*x0(j);

end

forj=i+1:

n

z=z+A(i,j)*x0(j);

end

x(i)=(b(i)-z)/A(i,i);

end

ifnorm(x-x0)<=eps||k>30

break;

end

x0=x;

end

ifk>=30

disp('迭代次数太多!

')

x='';

return;

end

return;

逐次超松驰迭代法

function[xk]=EqtsSOR(A,b,x0,omiga,eps)

%超松弛(SOR,SuccessiveOver-Relaxation)迭代法求解线性方程组Ax=b

%[xk]=EqtsSOR(A,b,x0,eps)

%x:

解向量,列向量

%k:

迭代次数

%A:

系数矩阵

%b:

列向量

%x0:

迭代初始值,列向量

%omiga:

松弛因子,可缺省,缺省值为1,即为GS迭代法

%eps:

误差限,可缺省,缺省值为0.5e-6

%

%应用举例:

%A=[430;34-1;0-14];b=[24;30;-24];x0=[1;1;1];omiga=1.25;

%[xk]=EqtsSOR(A,b,x0,omiga,0.5e-6)

%x=EqtsSOR(A,b,x0)

ifnargin==4

eps=0.5e-6;

end

ifnargin==3

omiga=1;

eps=0.5e-6;

end

%检查输入参数

n=length(b);

ifsize(A,1)~=n||n~=length(x0)

disp('输入参数有误!

');

x='';

k='';

return;

end

%迭代求解

k=0;

x=zeros(n,1);

while1

k=k+1;

fori=1:

n

z=0;

forj=1:

i-1

z=z+A(i,j)*x(j);

end

forj=i+1:

n

z=z+A(i,j)*x0(j);

end

x(i)=(1-omiga)*x0(i)+omiga*(b(i)-z)/A(i,i);

end

ifnorm(x-x0)<=eps||k>30

break;

end

x0=x;

end

ifk>=30

disp('迭代次数太多!

')

x='';

return;

end

return;

连分式插值

functionf=DCS(x,y,x0)

symst;

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

n=length(x);

c(1:

n)=0.0;

else

disp;

return;

end

c

(1)=y

(1);

for(i=1:

n-1)

for(j=1+1:

n)

y1(j)=(x(j)-x(i)/(y(j)-y(i));

end

c(i+1)=y1(i+1);

y=y1;

end

f=c(n);

for(i=1:

n-1)

f=c(n-i)+(t-x(n-i))/f;

f=vpa(f,6);

if(i==n-1)

if(nargin==3)

f=subs(f,'t',x0);

else

f=vpa(f,6);

end

end

end;

用二分法求方程的一个根

functionroot=HalfInterval(f,a,b,eps)

if(nargin==3)

eps=1.0e-4;

end

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

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

if(f1==0)

root=a;

end

if(f2==0)

root=b;

end

if(f1*f2>0)

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

');

return;

else

root=FindRoots(f,a,b,eps);

end

functionr=FindRoots(f,a,b,eps)

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

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

mf=subs(sym(f),findsym(sym(f)),(a+b)/2);

if(f_1*mf>0)

t=(a+b)/2;

r=FindRoots(f,t,b,eps);

else

if(f_1*mf==0)

r=(a+b)/2;

else

if(abs(b-a)<=eps)

r=(b+3*a)/4;

else

s=(a+b)/2;

r=FindRoots(f,a,s,eps);

end

end

end

Hermite插值的matlab代码

functionf=Hermite(x,y,y_1,x0)

symst;

f=0.0;

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

if(length(y)==length(y_1))

n=length(x);

else

disp('y和y的导数的维数不相等!

');

return;

end

else

disp('x和y的维数不相等!

');

return;

end

fori=1:

n

h=1.0;

a=0.0;

forj=1:

n

if(j~=i)

h=h*(t-x(j))^2/((x(i)-x(j))^2);

a=a+1/(x(i)-x(j));

end

end

f=f+h*((x(i)-t)*(2*a*y(i)-y_1(i))+y(i));

if(i==n)

if(nargin==4)

f=subs(f,'t',x0);

else

f=vpa(f,6);

end

end

end

辛普生公式的求积

function[Sn]=IntCompSimpson(f,D4f,a,b,eps)

ifnargin==4

eps=0.5e-7;%默认精度

end

%求被积函数的四次导数在区间[a,b]上的最大值

[x,fval]=fminbnd(D4f,a,b,optimset('TolX',eps/10));

fmax=-fval;

%计算等分区间数

n=ceil(sqrt(sqrt(abs((b-a)^5*fmax/16/180/eps))));

h=(b-a)/n;%步长

S=f(a)+f(b)+4*f(a+h/2);

fork=1:

n-1

x1=a+k*h;

x2=x1+h/2;

S=S+4*f(x2)+2*f(x1);

end

S=S*h/6;

return;

复化梯形公式求积分

function[Tn]=IntCompTrape(f,D2f,a,b,eps)

%复化梯形公式求积分

%[Tn]=IntCompTrape(f,D2f,a,b,eps)

%T:

求积结果

%n:

区间等分数

%f:

被积函数,可利用函数脚本文件事先定义,也可以利用内联函数

?

f:

被积函数的二次导数的相反值,可利用函数脚本文件事先定义,也可以利用内联函数

%取相反值是为了便于计算被积函数的二次导数在区间[a,b]上的最大值

%a:

积分下限

%b:

积分上限

%eps:

误差限

%

%应用举例:

%事先定义

%[Tn]=IntCompTrape(@IntF,@IntD2F,0,1)

%[Tn]=IntCompTrape(@IntF,@IntD2F,0,1,0.5e-7)

%利用内联函数

%F=inline('3^x');D2F=inline('-(log(3))^2*3^x');

%[Tn]=IntCompTrape(F,D2F,0,1)

ifnargin==4

eps=0.5e-7;%默认精度

end

%求被积函数的二次导数在区间[a,b]上的最大值

[x,fval]=fminbnd(D2f,a,b,optimset('TolX',eps/10));

fmax=-fval;

%计算等分区间数

n=ceil(sqrt(abs(fmax*(b-a)^3/12/eps)));

h=(b-a)/n;%步长

T=f(a)+f(b);

fork=1:

n-1

x1=a+k*h;

T=T+2*f(x1);

end

T=h*T/2;

return;

拉格朗日插值

(1)

functionf=InterpLagra

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

当前位置:首页 > 工程科技 > 电子电路

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1