在 MATLAB 中通过最小二乘法拟合数据
Fitting data by least squares in MATLAB
给定以下数据点
我正在尝试使用最小二乘法找到最佳拟合模型。
给出了两个模型。
我的方法是将方程重写为以下形式。
其中
和
其中
和
我编写了以下 MATLAB 代码来计算不同方程的系数 a、b。
对于第一个方程我写了下面的代码来计算系数a
x = [150 200 300 500 1000 2000]';
y = [2 3 4 5 6 7]';
func =@(x) (1/x-1/8);
yy=arrayfun(func,y);
A = 1./x;
c= A\yy; yanp= A*c; error = yy-yanp;
rms(error) % Root mean square error.
给我 a= 48.4692,均方根误差为 0.0310。
对于第二个等式,我编写了以下代码来计算系数 a、b。
x = [150 200 300 500 1000 2000]';
y = [2 3 4 5 6 7]';
yy = log(8-y);
A = [ones(6,1) log(x)];
c= A\yy; yanp= A*c; error= yy-yanp;
a = exp(c(1)); %Converting back
b= c(2);
rms(error)
给我 a=174.5247,b= -0.6640,均方根误差为 0.0756
我的结果表明第一个方程是更好的近似值,因为误差更小,但是我的同学们声称第二个方程给出的误差更小,因此是更好的近似值。我怀疑我在计算的某个地方犯了错误,我正在寻找指导。
在你的第二种情况下,你没有正确计算你的错误。您需要将 yanp
转换回 "true units" 并与输入 y
:
进行比较
error = y-(8-exp(yanp));
给定以下数据点
我正在尝试使用最小二乘法找到最佳拟合模型。
给出了两个模型。
我的方法是将方程重写为以下形式。
其中
和
其中
和
我编写了以下 MATLAB 代码来计算不同方程的系数 a、b。
对于第一个方程我写了下面的代码来计算系数a
x = [150 200 300 500 1000 2000]';
y = [2 3 4 5 6 7]';
func =@(x) (1/x-1/8);
yy=arrayfun(func,y);
A = 1./x;
c= A\yy; yanp= A*c; error = yy-yanp;
rms(error) % Root mean square error.
给我 a= 48.4692,均方根误差为 0.0310。
对于第二个等式,我编写了以下代码来计算系数 a、b。
x = [150 200 300 500 1000 2000]';
y = [2 3 4 5 6 7]';
yy = log(8-y);
A = [ones(6,1) log(x)];
c= A\yy; yanp= A*c; error= yy-yanp;
a = exp(c(1)); %Converting back
b= c(2);
rms(error)
给我 a=174.5247,b= -0.6640,均方根误差为 0.0756
我的结果表明第一个方程是更好的近似值,因为误差更小,但是我的同学们声称第二个方程给出的误差更小,因此是更好的近似值。我怀疑我在计算的某个地方犯了错误,我正在寻找指导。
在你的第二种情况下,你没有正确计算你的错误。您需要将 yanp
转换回 "true units" 并与输入 y
:
error = y-(8-exp(yanp));