数值分析实验四 最小二乘法曲线拟合

一、实验目的

1.使用不同的模型对数据进行最小二乘拟合;
2.分析使用不同模型最小二乘法对数据进行拟合的RMSE(均方根误差);
3.根据分析结果求出最合理的拟合模型。

二、实验题目

1.用表1-1中的世界人口统计数值估计1980年的人口,求最佳最小二乘法数值估计:
在这里插入图片描述(a) 直线;(b) 抛物线。它们都通过这些数据点,并求这些拟合的RMSE。在每一种情形下,估计1980年的人口。哪一种拟合给出最佳估计。(40分)
2. 世界石油产量以每天百万桶计,如表1-2所示,求最佳最小二乘法数值估计:
在这里插入图片描述(a) 直线;(b) 抛物线;© 立方曲线。它们都通过10个数据点。并求这些拟合的RMSE。利用上面的每一种拟合来估计2010年的生产水平。就RMSE而言,那一种拟合最好的代表了这些数据。(60分)
说明:RMSE(root-mean-square error,均方根误差)。

三、实验原理

1、最小二乘法

已知:一组数据(xi,yi)(i = 0,1,…,m),在函数集合
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、实验内容与结果

1.用表1-1中的世界人口统计数值估计1980年的人口,求最佳最小二乘法数值估计:
(a) 直线拟合估计1980年的人口结果及RMSE分析(15分)

1. 程序源码

拟合函数代码
function [population,RMSE] = fit(x,y,n,year)
%FIT 此处显示有关此函数的摘要
%   此处显示详细说明
count_x = length(x);
G = zeros(n+1,n+1);
Gf = zeros(n+1,1);%计算法方程组等式最左边
for i=1:n+1for j=1:n+1m = 0;for k=1:count_xm = m + x(k)^(i+j-2);endG(i,j) = m;end
end%计算法方程组等式右边
for i=1:n+1m = 0;for k = 1:count_xm = m + x(k)^(i-1)*y(k);endGf(i) = m;
end%列主消元法求系数
[augmentedMatrix,a] = ColMain(G,Gf);%对系数矩阵进行翻转
a = fliplr(a');
x_new = x(1):5:x(count_x);
pre = polyval(a,x_new);
population = polyval(a,year);
plot(x,y,'r*',x_new,pre,'kx-',year,population,'bo');
legend('原始数据','拟合曲线','1980预测','Location','NorthWest');%计算RMSE
Gx =  polyval(a,x);
sum = 0;
for i=1:count_xsum = sum + (Gx(i)-y(i))^2;
end
RMSE = sqrt((sum)/count_x);
end
高斯消元求系数代码
function [augmentedMatrix,ans] = ColMain(A,b)
%COLMAIN 此处显示有关此函数的摘要
%   此处显示详细说明%常量定义
ZERO = 10^(-15);%增广矩阵
augmentedMatrix = [A b];[row_a,col_a] = size(A);
[row_b,col_b] = size(b);%解
ans = zeros(col_a,1);%先判断A是不是方阵
if row_a ~=col_asprintf('矩阵A不是方阵')return;
end%判断b是否符合要求
if row_b ~= row_asprintf('b的格式为列向量且b的行数和A的行数要相同')return;
end%判断b的行和A的行是否一致
if row_a ~= row_bsprintf('向量b长度必须和矩阵A的行数相等')return;
end%进行消元
for col = 1:col_a-1%找每一列的最大值maxCol = max(abs(augmentedMatrix(col:row_a,col)));%判断A是否为系数矩阵if maxCol < ZEROsprintf('系数矩阵A是奇异矩阵!程序退出!')return;end%进行交换for row = col:col_aif maxCol == ((augmentedMatrix(row,col)))temp = augmentedMatrix(row,:);augmentedMatrix(row,:) = augmentedMatrix(col,:);augmentedMatrix(col,:) = temp;break;endend%执行消元操作for row = col+1:col_a%计算mijmRowCol = (augmentedMatrix(row,col)/augmentedMatrix(col,col));%消元augmentedMatrix(row,:) = augmentedMatrix(row,:)-mRowCol*augmentedMatrix(col,:);end
end%将每个解的系数变为1,就相当于是最后除去系数了
for row = 1:row_aaugmentedMatrix(row,:) = augmentedMatrix(row,:)/augmentedMatrix(row,row);
end%消元后的b
b = augmentedMatrix(:,col_a+1);%回带求解
ans(col_a) = b(col_a);
for row = col_a - 1:-1:1ans(row) = 0;for col = row+1:col_aans(row) = ans(row) + augmentedMatrix(row,col)*ans(col);endans(row) = b(row) - ans(row);
end
end

2.计算结果与分析
将数据代入程序中,得到预测的1980年的人口数量大约为:4.527079702000000e+09
RMSE=3.675108816241655e+07
在这里插入图片描述
在这里插入图片描述
(b) 抛物线拟合估计1980年的人口的结果及RMSE分析(15分)

1. 程序源码

拟合函数代码
function [population,RMSE] = fit(x,y,n,year)
%FIT 此处显示有关此函数的摘要
%   此处显示详细说明
count_x = length(x);
G = zeros(n+1,n+1);
Gf = zeros(n+1,1);%计算法方程组等式最左边
for i=1:n+1for j=1:n+1m = 0;for k=1:count_xm = m + x(k)^(i+j-2);endG(i,j) = m;end
end%计算法方程组等式右边
for i=1:n+1m = 0;for k = 1:count_xm = m + x(k)^(i-1)*y(k);endGf(i) = m;
end%列主消元法求系数
[augmentedMatrix,a] = ColMain(G,Gf);%对系数矩阵进行翻转
a = fliplr(a');
x_new = x(1):5:x(count_x);
pre = polyval(a,x_new);
population = polyval(a,year);
plot(x,y,'r*',x_new,pre,'kx-',year,population,'bo');
legend('原始数据','拟合曲线','1980预测','Location','NorthWest');%计算RMSE
Gx =  polyval(a,x);
sum = 0;
for i=1:count_xsum = sum + (Gx(i)-y(i))^2;
end
RMSE = sqrt((sum)/count_x);
end
高斯消元求系数代码
function [augmentedMatrix,ans] = ColMain(A,b)
%COLMAIN 此处显示有关此函数的摘要
%   此处显示详细说明%常量定义
ZERO = 10^(-15);%增广矩阵
augmentedMatrix = [A b];[row_a,col_a] = size(A);
[row_b,col_b] = size(b);%解
ans = zeros(col_a,1);%先判断A是不是方阵
if row_a ~=col_asprintf('矩阵A不是方阵')return;
end%判断b是否符合要求
if row_b ~= row_asprintf('b的格式为列向量且b的行数和A的行数要相同')return;
end%判断b的行和A的行是否一致
if row_a ~= row_bsprintf('向量b长度必须和矩阵A的行数相等')return;
end%进行消元
for col = 1:col_a-1%找每一列的最大值maxCol = max(abs(augmentedMatrix(col:row_a,col)));%判断A是否为系数矩阵if maxCol < ZEROsprintf('系数矩阵A是奇异矩阵!程序退出!')return;end%进行交换for row = col:col_aif maxCol == ((augmentedMatrix(row,col)))temp = augmentedMatrix(row,:);augmentedMatrix(row,:) = augmentedMatrix(col,:);augmentedMatrix(col,:) = temp;break;endend%执行消元操作for row = col+1:col_a%计算mijmRowCol = (augmentedMatrix(row,col)/augmentedMatrix(col,col));%消元augmentedMatrix(row,:) = augmentedMatrix(row,:)-mRowCol*augmentedMatrix(col,:);end
end%将每个解的系数变为1,就相当于是最后除去系数了
for row = 1:row_aaugmentedMatrix(row,:) = augmentedMatrix(row,:)/augmentedMatrix(row,row);
end%消元后的b
b = augmentedMatrix(:,col_a+1);%回带求解
ans(col_a) = b(col_a);
for row = col_a - 1:-1:1ans(row) = 0;for col = row+1:col_aans(row) = ans(row) + augmentedMatrix(row,col)*ans(col);endans(row) = b(row) - ans(row);
end
end

3.计算结果与分析
将数据代入程序中,得到预测的1980年的人口数量大约为:4.472888283964722e+09
RMSE=1.712971418739812e+07
在这里插入图片描述
在这里插入图片描述
(c)估计1980年的人口,根据拟合的RMSE,比较分析哪一种拟合给出的是最佳估计。(10分)
直线拟合的RMSE=3.675108816241655e+07
抛物线拟合的RMSE=1.712971418743657e+07
我们可以看出,抛物线拟合的RMSE更小,所以抛物线拟合要好一些

世界石油产量,求最佳最小二乘法数值估计:
(a) 直线估计世界石油产量2010年的生产水平,其估计结果及RMSE分析;(15分)
1.程序源码
源程序和上一题的都一样,此处省略
2.计算结果与分析
将数据代入程序中,得到2010年石油产量大约为:83.382272727811142
RMSE = 0.976318096449374
在这里插入图片描述
在这里插入图片描述
(b) 抛物线估计世界石油产量2010年的生产水平,其估计结果及RMSE分析;(15分)

  1. 程序源码
    源程序和上一题的都一样,此处省略
  2. 计算结果与分析
    将数据代入程序中,得到2010年石油产量大约为:74.411566176742781
    RMSE = 0.822676653645600
    在这里插入图片描述
    在这里插入图片描述

(c)立方曲线估计世界石油产量2010年的生产水平,其估计结果及RMSE分析;(15分)
3. 程序源码

x0 = [1994,1995,1996,1997,1998,1999,2000,2001,2002,2003];
y0 = [67.052000000000000,68.008000000000000,69.803000000000000,72.024000000000000,73.400000000000000,72.063000000000000,74.669000000000000,74.487000000000000,74.065000000000000,76.777000000000000];
u = [2010];
a3 = polyfit(x0,y0, 3);
x_new = [x0 x0(length(x0))+1:1:2010];
pre = polyval(a3,x_new);
petrol_pre = polyval(a3,2010);plot(x0, y0, 'red*-', x_new, pre, 'kx-',2010,petrol_pre,'bo');
legend('原始数据','三次曲线拟合','2010预测','Location','NorthWest');
xlabel('年份');
ylabel('人口数量');
  1. 计算结果与分析
    将数据代入程序中,得到2010年石油产量大约为:99.041972219944000
    RMSE = 0.757849725078017
    在这里插入图片描述
    在这里插入图片描述
    (d)估计世界石油产量2010年的生产水平,根据拟合的RMSE,比较分析哪一种拟合给出的是最佳估计。(15分)
    从上面的结果中,我们可以看出:
    直线模型的RMSE=0.976318096449374
    抛物线模型的RMSE=0.822676653645600
    立方曲线模型的RMSE=0.757849725078017
    所以立方曲线模型拟合效果更好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/253452.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

最小二乘法的拟合原理

一. 最小二乘法的拟合原理 根据《数学指南》书中的解释: 图2 《数学指南》中对最小二乘法的解释 上面这段话&#xff0c;枯燥且无趣&#xff0c;大家不用厌恶&#xff0c;数学向来这个样子。 现在&#xff0c;我们来慢慢认识上面这段话的意思&#xff0c;这句话的意思是说&a…

最小二乘法拟合直线

曲线拟合中最基本和最常用的是直线拟合。设x和y之间的函数关系为&#xff1a; y&#xff1d;abx 式中有两个待定参数&#xff0c;a代表截距&#xff0c;b代表斜率。对于等精度测量所得到的N组数据&#xff08;xi&#xff0c;yi&#xff09;&#xff0c;i&#xff1d;1&#xff…

多项式函数曲线拟合——最小二乘法

多项式函数拟合的任务是假设给定数据由M次多项式函数生成&#xff0c;选择最有可能产生这些数据的M次多项式函数&#xff0c;即在M次多项式函数中选择一个对已知数据以及未知数据都有很好预测能力的函数。 最小二乘法&#xff08;又称最小平方法&#xff09;是一种数学优化技术…

最小二乘法入门(Matlab直线和曲线拟合)

参考博客&#xff1a;https://blog.csdn.net/wokaowokaowokao12345/article/details/72850143 多的就不多说了&#xff0c;持续脱发中&#xff01;&#xff01;&#xff01; 最小二乘法历史起源之类的&#xff1a;https://baike.baidu.com/item/%E6%9C%80%E5%B0%8F%E4%BA%8C%…

曲线拟合的最小二乘原理

文章目录 1 什么是最小二乘2 最小二乘原理3 最小二乘应用示例4 法方程到底是什么 1 什么是最小二乘 在科学实验的统计方法研究中&#xff0c;往往要从一组实验数据 ( x i , y i ) ( i 0 , 1 , 2 , … , m ) (x_i,y_i)(i0,1,2,…,m) (xi​,yi​)(i0,1,2,…,m) 中寻找自变量 …

最小二乘法曲线拟合原理

最小二乘法曲线拟合原理 一、最小二乘法原理 对于给定的一组数据&#xff08;xi,yi&#xff09;&#xff0c;假定它满足n次多项式&#xff1a; 为了求取各阶参数的最优解&#xff0c;对于每个xi&#xff0c;通过n次多项式计算的值和yi之间的差值的平方和应该最小&#xff0c…

最小二乘法

1、概述 最小二乘法&#xff08;又称最小平方法&#xff09;是一种数学优化技术。它通过最小化误差&#xff08;真实目标对象与拟合目标对象的差&#xff09;的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据&#xff0c;并使得这些求得的数据与实际数…

最小二乘法多项式曲线拟合原理与实现

概念 最小二乘法多项式曲线拟合&#xff0c;根据给定的m个点,并不要求这条曲线精确地经过这些点&#xff0c;而是曲线yf(x)的近似曲线y φ(x)。 原理 [原理部分由个人根据互联网上的资料进行总结&#xff0c;希望对大家能有用] 给定数据点pi(xi,yi)&#xff0c;其中i1,2,…,m…

最小二乘法曲线拟合以及Matlab实现

最小二乘法曲线拟合以及Matlab实现 在实际工程中&#xff0c;我们常会遇到这种问题&#xff1a;已知一组点的横纵坐标&#xff0c;需要绘制出一条尽可能逼近这些点的曲线&#xff08;或直线&#xff09;&#xff0c;以进行进一步进行加工或者分析两个变量之间的相互关系。而获…

最小二乘法(least squares)的曲线拟合(curve fitting)

第三十八篇 最小二乘法的曲线拟合 如果我们想得到一个通过大量由实验或者计算机程序获得的数据点的函数,它实际是在寻找一个“最适合”数据的函数,而不是一个完全经过所有点。可以采用各种策略来最小化各个数据点之间的误差和逼近函数。其中最著名的是最小二乘法&#xff0c;它…

曲线拟合——最小二乘法( Ordinary Least Square,OLS)

文章目录 前言一、曲线拟合是什么&#xff1f;二、最小二乘法是什么&#xff1f;三、求解最小二乘法&#xff08;包含数学推导过程&#xff09;四、使用步骤1.引入库2.读入数据 总结 前言 随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都…

最小二乘法进行曲线拟合

工作需求&#xff0c;这里记录一下数值插值和数值分析方面的算法&#xff0c;希望和大家一起进步。 曲线拟合的最小二乘定义 求一条曲线,使数据点均在离此曲线的上方或下方不远处,所求的曲线称为拟合曲线, 它既能反映数据的总体分布,又不至于出现局部较大的波动,更能反映被逼…

最小二乘法的曲线拟合

最小二乘法解决的问题&#xff1a;AxC 无解下的最优解 例子1&#xff1a; 一条过原点的直线OA&#xff0c;C是直线外一点&#xff0c;求C在OA上的投影点P 例子1 例子2&#xff1a; 已知三个不在一条直线上的点A,B,C&#xff0c;求一条直线&#xff0c;使A,B,C到直线的距离和最小…

最小二乘法曲线拟合

最小二乘法曲线拟合以及Matlab实现 在实际工程中&#xff0c;我们常会遇到这种问题&#xff1a;已知一组点的横纵坐标&#xff0c;需要绘制出一条尽可能逼近这些点的曲线&#xff08;或直线&#xff09;&#xff0c;以进行进一步进行加工或者分析两个变量之间的相互关系。而获…

chatgpt赋能python:Python中输出的完整指南

Python中输出的完整指南 在Python中进行编程&#xff0c;输出是至关重要的一部分。它可用于在命令行界面或Web应用程序中显示结果、数据操作等。Python具有各种输出方法&#xff0c;包括print语句&#xff0c;文件和日志记录。在本文中&#xff0c;我们将深入研究Python中输出…

机器视觉康耐视智能相机Insight-手眼标定详细步骤

(Q有答疑)康耐视VisionPro工具与脚本入门级系列教程2023 In-Sight 智能相机包含标定手眼的工具 CalibrateGrid,用手动的标定方式,即将康耐视标定片固定在运动平台上,然后手动输入电机位置坐标,要保证电机在 X 方向移动一次,Y 方向移动一次,旋转两次角度,切旋转角度差不能…

ChatGPT的4个不为人知却非常实用的小功能

今天重点介绍四个ChatGPT很实用的小功能。 一、停止生成 如果在ChatGPT输出内容的过程中&#xff0c;我们发现结果不是自己想要的&#xff0c;可以直接点击“Stop generating”按钮&#xff0c;这样它就会立即停止输出。 二、复制功能 在ChatGPT返回对话的右侧&#xff0c;有三…

SQL 插入带引号的字段

今天突然想了下给字段插入引号的SQL该怎样写&#xff0c;然后就百度了一下&#xff0c;结果看各位的结果真是云里雾里啊 ╮(╯▽╰)╭ 然后就自己本机测试了一下 O(∩_∩)O&#xff0c;三种数据库都可以 不知道我这样写有没有问题呢 ... 稍微介绍一下吧&#xff1a; 如果要向…

什么是IPSec?6000字带你详细剖析,很赞!

关注、星标公众号&#xff0c;精彩内容每日送达 来源&#xff1a;网络素材 1.IPSEC协议簇安全框架 a.IPSec简介 IPSec&#xff08;Internet Protocol Security&#xff09;&#xff1a;是一组基于网络层的&#xff0c;应用密码学的安全通信协议族。IPSec不是具体指哪个协议&…

C++ set类成员函数介绍 (set和multiset)

目录 &#x1f914;set模板介绍&#xff1a; &#x1f914;特点&#xff1a; &#x1f914;set的成员函数&#xff1a; &#x1f60a;set构造函数&#xff1a; &#x1f50d;代码实例&#xff1a; &#x1f50d;运行结果&#xff1a; &#x1f60a; set赋值函数&#xf…