本算法已经整理成文档如下,有需要的朋友可以点击进行下载
序号 | 文档(点击下载) |
---|---|
本项目文档 | 【老生谈算法】数据分析-MATLAB相关算法.docx |
一.非线性方程求解
1.二分法
m文件:
function[c,err,yc]=bisect(f,a,b,delta)
%f是所要求解的函数
%a,b是区间的左右限
%delta是误差界
%c是近似解
%yc是函数f在c上的值,err为误差
if nargin<4
delta=1e-5;
end
ya=feval('f',a);
yb=feval('f',b);
if yb==0
c=b,return,end
if ya*yb>0,
disp('(a,b)不是有根区间');
return,end
max1=1+round((log(b-a)-log(delta))/log(2));
for k=1:max1
c=(a+b)/2;
yc=feval('f',c);
if yc==0
a=c;
b=c;
break,
elseif yb*yc>0
b=c;
yb=yc;
else
a=c;
ya=c;
end
if (b-a)<delta
break,
end
k,c=(a+b)/2,err=abs(b-a),yc=feval('f',c);
end
2.不动点迭代
m文件
function[p0,k,err,p]=fixpt(g,p0,tol.max1)
%g是给定的迭代函数
%p0是初值
%p是不动点的近似值
P(1)=p0;
for k=2:max1
P(k)=feval('g',P(k-1));
k,err=abs(P(k)-P(k-1))
p=P(k);
if (err<tol)
break;end
if k==max1
disp('超过了迭代最大次数;
end
end
P
选定的迭代函数:
function y=g(x)
y=sin(x)/x;
二.方阵的特征值与特征向量
1幂法
function [m xbiaozhi]=mifa(A,jingdu,cishu)
%幂法求矩阵最大特征值,其中
%m为绝对值最大的特征值,x为对应最大特征值的特征向量
%biaozhi表明迭代是否成功
if nargin<3
cishu=100;
end
if nargin<2
jingdu=1e-5;
end
n=length(A);
x=ones(n,1);
biaozhi='迭代失败!';
k=0;m1=0;
while k<=cishu
v=A*x;
[vmax,k]=max(abs(v));
m=v(k);
x=v/m;
if abs(m-m1)<jingdu
biaozhi='迭代成功!';break;
end
m1=m;
k=k+1;
end
三.常微分方程求解
1.改进欧拉法解微分方程
function yout=gaijinoula(f,x0,y0,xn,n)
%定义输入输出
x=zeros(1,n+1);y=zeros(1,n+1);
x(1)=x0;y(1)=y0;
h=(xn-x0)/n;
for i=1:n
x(i+1)=x(i)+h;
z0=y(i)+h*feval(f,x(i),y(i));
y(i+1)=y(i)+(feval(f,x(i),y(i))+feval(f,x(i+1),z0))*h/2;
end
shuchu=[x',y']
fprintf(' x(i) y(i)')
举例:
所要求解的函数:
function Dy=f(x,y)
Dy=x+y;
2.四阶龙格库塔法解微分方程
functionyout=xin(bianliang)
%定义输入输出
clear all
x0=0;xn=1;y0=1;h=0.1;
%设置初始值、区间和步长
[y,x]=lgkt4j(x0,xn,y0,h);
%四阶龙格库塔法
n=length(x);
fprintf(' i x(i) y(i)\n');
%输出格式
for i=1:n
fprintf('%2d %3.3f %4.4f\n',i,x(i),y(i));
end
function[y,x]=lgkt4j(x0,xn,y0,h)
x=x0:h:xn;
%设置区间
n=length(x);
y1=x;
y1(1)=y0;
for i=1:n
K1=f(x(i),y1(i));
K2=f(x(i)+h/2,y1(i)+h/2*K1);
K3=f(x(i)+h/2,y1(i)+h/2*K2);
K4=f(x(i)+h,y1(i)+h*K3);
y1(i+1)=y1(i)+h/6*(K1+2*K2+2*K3+K4);
end
y=y1;
举例:
function Dy=f(x,y)
Dy=y-2*x/y;
执行结果为:
i x(i) y(i)
1 0.000 1.0000
2 0.100 1.0954
3 0.200 1.1832
4 0.300 1.2649
5 0.400 1.3416
6 0.500 1.4142
7 0.600 1.4832
8 0.700 1.5492
9 0.800 1.6125
10 0.900 1.6733
11 1.000 1.7321
四.插值法
1拉格朗日插值
function[c,l]=lglr(x,y)
%x为n个节点的横坐标组成的向量,y为纵坐标组成的向量
%c为插值函数的系数组成的向量
%输出为差值多项式的系数
w=length(x);
n=w-1;
l=zeros(w,w);
for k=1:n+1
v=1;
for j=1:n+1
ifk~=j
v=conv(v,poly(x(j)))/(x(k)-x(j));
end
end
l(k,:)=v;
end
c=y*l;
五.数据拟合
1.最小二乘拟合
functionc=zxrc(x,y,m)
%x是数据点横坐标,y数据点纵坐标
%m要构造的多项式的系数,c是多项式由高到低的系数所组成的向量
n=length(x);
b=zeros(1:m+1);
f=zeros(n,m+1);
fork=1:m+1
f(:,k)=x'.^(k-1);
end
a=f'*f;
b=f'*y';
c=a\b;
c=flipud(c);
六.矩阵相关程序
1.求矩阵的行列式
functiond=hanglieshi(a)
%求任意输入矩阵的行列式
clearall;
a=input('输入矩阵a=');
d=1;
n=size(a); %方阵的行(或者列)数
fork=1:n-1
e=a(k,k); %设矩阵的主元
fori=k:n %求出矩阵的全主元
forj=k:n
ifabs(a(i,j))>e
e=a(i,j);
p=i;
q=j;
elsec=0;
end
end
end
for j=k:n%行交换
t=a(k,j);
a(k,j)=a(p,j);
a(p,j)=t;
end
if p~=k %判断行列式是否换号
d=d*(-1);
elsed=d;
end
for i=k:n%列交换
t=a(i,k);
a(i,k)=a(i,q);
a(i,q)=t;
end
if q~=k %判断行列式是否换号
d=d*(-1);
elsed=d;
end
ifa(k,k)~=0
for i=k+1:n %消元
r=a(i,k)/a(k,k);
forj=k+1:n
a(i,j)=a(i,j)-r*a(k,j);
end
end
elsed=d;
end
end
for i=1:n%求行列式
d=d*a(i,i);
end
disp('矩阵a的行列式为:')
d
2.矩阵的换行
functionc=huanhang(a)
%实现矩阵换行
clearall;
a=input('输入矩阵a=');
[m,n]=size(a);
forj=1:n
t=a(1,j);
a(1,j)=a(2,j);
a(2,j)=t;
end
c=a;
disp('换行后矩阵a变为:')
c
3.列主元消元法解方程
functiond=jiefang(a)
%列主元消元法解方程
clearall;
a=input('输入矩阵a=');
[row,column]=size(a);
fori=1:column%每一列的列标
m(i)=i;
s(i)=0;
x(i)=0;
end
for k=1:row-1%最后一行不用比较
e=a(k,k);
p=k;
q=k;
fori=k:row
forj=k:column-1
ifabs(a(i,j))>abs(e)
e=a(i,j);
p=i;
q=j;
elsec=0;
end
end
end
t=m(k); %换列标记
m(k)=m(q);
m(q)=t;
for i=1:row %列交换
t=a(i,k);
a(i,k)=a(i,q);
a(i,q)=t;
end
for j=k:column %行变换
t=a(k,j);
a(k,j)=a(p,j);
a(p,j)=t;
end
ifa(k,k)==0 %消元
disp('非唯一解')
else for i=k+1:row
r=a(i,k)/a(k,k);
forj=k:column
a(i,j)=a(i,j)-r*a(k,j);
end
end
end
end
ifa(row,row)==0
disp('非唯一解')
else
s(row)=a(row,column)/a(row,row);
s(row)
q=m(row);
x(q)=s(row);
fori=row-1:1
forj=i+1:row
s(i)=s(i)+a(i,j)*x(i);
end
s(i)=[a(i,column)-s(i)]/a(i,i);
q=m(i);
x(q)=s(i);
end
end
fori=1:row
x(i)
end
end
4.两矩阵相乘
functiond=chengfa(A,B)
% 实现两个矩阵相乘
clearall;
A=input('输入矩阵A=');
B=input('输入矩阵B=')
[mn]=size(A);
[nbp]=size(B);
C=zeros(m,p);
ifn~=nb
disp('不满足矩阵相乘条件')
elsefor i=1:m
forj=1:p
d=0;
fork=1:n
d=d+A(i,k)*B(k,j);
end
C(i,j)=d;
end
end
disp('矩阵AB结果为:')
C
End
5.矩阵元素最大值及下标
functiond=xunzhuyuan(a)
%求一个矩阵的最大元素及其下标
clearall;
a=input('输入矩阵a=');
e=a(1,1); %设e=a(1,1)为最大元素
p=1;
q=1;
[m,n]=size(a);
fori=1:m
forj=1:n
ifabs(a(i,j))>e
e=a(i,j);
p=i;
q=j;
elsec=0;
end
end
end
disp('最大元素为:')
d=a(p,q)
disp('最大元素所在的行为:')
p
disp('最大元素所在的列为:')
q
end
6 矩阵元素最大值及下标
functiond=zuidazhi(A)
%求矩阵的最大元素及其下标
clearall;
A=input('输入矩阵A=');
B=A'; %转置
[a,r]=max(A); %求出矩阵A每一列的最大值和每列最大值所在的行数
[maxV,column]=max(a); %最大元素及其所在的列
[b,c]=max(B);
[maxV1,row]=max(b);%最大元素及其所在的行
disp('矩阵A的最大元素为:')
maxV
disp('矩阵A最大元素所在的列为:')
column
disp('矩阵A最大元素所在的行为:')