曲线拟合最小二乘法
(生成函数为1,x,x2,x3,…,x^n)
M文件
function a=LSF(x0,y0,w,n)
G=zeros(n+1,n+1);
d=zeros(n+1,1);
a=zeros(n+1,1);
m=length(x0);
for i=1:n+1
for j=i:n+1
把这部分补上,提示 w(k)*x0(k).^(i-1); w(k)表示权系数;x0(k).^(i-1)表示幂次;G(j,i)=G(i,j);G为法矩阵。需要两个循环。向量d(i,1)=0;为初始值。
end
a=G\d;
a=flipud(a);
end
程序
clear
x0=[0.0 0.1 0.2 0.3 0.5 0.8 1.0];
y0=[1.0 0.41 0.50 0.61 0.91 2.02 2.46];
w=ones(size(x0));
%subplot(2,2,1);
x=0:0.01:1;
al=LSF(x0,y0,w,2);
y=polyval(al,x);
plot(x0,y0,‘ok’,x,y,‘r’)
title(‘2次曲线拟合’);
legend(‘y0’,‘y’);
填写
效果图
下面是教材150页,列主元消去法解线性方程组,补充完整并运行
function time = ColumnPivot(n, A, b)
%B = [A b];
tic;
for k = 1:n-1
max =abs(A(k,k));
m = k;
for j = k+1:n
if
max = ;
m = ;
end
end
disp(m);
A([k m], ) = A([m k], );
temp = b(m);
b(m) = b(k);
b(k) = temp;
disp(A);
if A(k,k) == 0
disp('the matrix has too many answers, please change the matrix');
return
end
for i = k+1:n
m = ;
A(i, k) = ;
A(i, k+1:n) = ;
b(i) = ;
end
disp(A);
end
x = zeros(n,1);
%disp(x)
if A(n, n) == 0
disp(‘the matrix has too many answers, please change the matrix’);
return
end
x(n) = b(n) / A(n,n);
for i = 1:n-1
x(i) = (b(i) - sum(A(i,i+1:n) * x(i+1:n)))/A(i,i);
%disp(x(i));
end
disp(x);
toc;
time = toc;
end
程序
A=[0.001,2,3;-1,3.712,4.623;-2,1.072,5.643];
b=[1,2,3]’;
ColumnPivot(3,A,b);
参考