gusucode.com > 高等数学问题求解源码程序 > CH12/Least_square.m

    function [p,A,b,FitFun]=Least_square(x,y,phifun,wfun)
%LEAST_SQUARE   最小二乘法
% P=LEAST_SQUARE(X,Y,PHIFUN)  利用基函数PHIFUN来拟合数据X和Y
% P=LEAST_SQUARE(X,Y,PHIFUN,WFUN)  利用基函数PHIFUN和权函数WFUN拟合数据X和Y
% [P,A,B]=LEAST_SQUARE(...)  最小二乘法拟合数据并返回法方程组的系数矩阵和右端向量
% [P,A,B,FITFUN]=LEAST_SQUARE(...)  最小二乘法拟合数据并返回拟合函数表达式
%
% 输入参数:
%     ---X,Y:实验数据
%     ---PHIFUN:拟合基函数,可以是匿名函数或内联函数
%     ---WFUN:权函数
% 输出参数:
%     ---P:最小二乘拟合系数
%     ---A:法方程组的系数矩阵
%     ---B:法方程组的右端向量
%     ---FITFUN:拟合函数表达式
%
% See also polyfit, lsqcurvefit

x=x(:); y=y(:);
if length(x)~=length(y)
    error('实验数据长度不一致.')
end
if nargin<4
    wfun=ones(size(x));
end
func=char(phifun);
func=strrep(func,'ones(size(x))','1');
func=strrep(func,'.*','*');
func=strrep(func,'./','/');
func=strrep(func,'.^','^');
k=strfind(func,'[');
func=sym(func(k(1):end));
phifun=phifun(x);
n=size(phifun,2);
A=zeros(n);b=zeros(n,1);
for k=1:n
    for j=1:n
        A(k,j)=0;
        for i=1:length(x)
            A(k,j)=A(k,j)+wfun(i)*phifun(i,j)*phifun(i,k);
        end
    end
    for i=1:length(x)
        b(k)=b(k)+wfun(i)*y(i)*phifun(i,k);
    end
end
p=A\b;
FitFun=vpa(dot(p,func),4);
web -broswer http://www.ilovematlab.cn/forum-221-1.html