【老生谈算法】matlab实现数据分析算法源码——数据分析

数据分析-MATLAB相关算法


1、文档下载:

本算法已经整理成文档如下,有需要的朋友可以点击进行下载

序号 文档(点击下载)
本项目文档 【老生谈算法】数据分析-MATLAB相关算法.docx

2、算法详解:

一.非线性方程求解
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最大元素所在的行为:')

你可能感兴趣的:(matlab算法原理详解,matlab,算法,数据分析)