2023年9月数学建模:最小二乘优化、曲线拟合与函数逼近

news/2024/11/29 1:37:03/

2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd

目录

1. 最小二乘优化

1.1 最小二乘优化的原理

1.2 最小二乘优化的方法

1.2.1 线性最小二乘法

1.2.1.1 正规方程

1.2.1.2 梯度下降法

2. 曲线拟合与函数逼近

2.1 曲线拟合

2.1.1 线性回归

2.1.2 多项式回归

2.2 函数逼近

2.2.1 正交函数逼近

3. 数学建模案例

3.1 问题描述

3.2 数据处理

3.3 函数拟合

3.4 预测未来感染人数

4. 总结


在本篇博客中,我们将详细讨论最小二乘优化、曲线拟合与函数逼近的概念,原理以及在实际问题中的应用。我们将首先介绍最小二乘优化的原理和方法,然后将这些方法应用于曲线拟合和函数逼近问题。接下来,我们将使用MATLAB代码实现这些方法,并通过数学建模案例,演示如何将这些技巧应用于实际问题。

1. 最小二乘优化

1.1 最小二乘优化的原理

最小二乘优化是一种数学方法,用于在一组已知数据点的基础上,寻找一条拟合曲线,使得数据点到拟合曲线的距离平方和最小。这种方法广泛应用于数据分析、信号处理、图像处理等领域。

具体来说,假设我们有一组n个观测数据点(x1, y1), (x2, y2), ..., (xn, yn),我们希望找到一个函数f(x),使得每个数据点(xi, yi)到函数f(x)的垂直距离的平方和最小,即:

minimize sum((yi - f(xi))^2)

1.2 最小二乘优化的方法

最小二乘优化的方法有很多,例如线性最小二乘法、非线性最小二乘法等。在本篇博客中,我们将主要介绍线性最小二乘法。

1.2.1 线性最小二乘法

线性最小二乘法是一种特殊的最小二乘优化方法,它假设待求的函数f(x)是关于参数向量θ的线性函数。也就是说,我们希望找到一个参数向量θ,使得:

minimize sum((yi - θ^T * φ(xi))^2)

其中,φ(xi)是一个关于输入数据xi的基函数向量。在线性回归问题中,φ(xi) = [1, xi];在多项式回归问题中,φ(xi) = [1, xi, xi^2, ..., xi^m],其中m是多项式的阶数。

线性最小二乘问题可以通过求解正规方程(Normal Equation)或使用梯度下降法(Gradient Descent)等方法求解。下面,我们将介绍这两种方法的原理及MATLAB代码实现。

1.2.1.1 正规方程

正规方程是一种解析解法,它可以直接求得线性最小二乘问题的最优解。具体来说,对于上述线性最小二乘问题,其正规方程为:

θ = (X^T * X)^(-1) * X^T * y

其中,X是一个nm+1列的矩阵,每一行为一个数据点的基函数向量,即X(i, :) = φ(xi)y是一个n维向量,每个元素为一个数据点的yi值。

下面是使用MATLAB求解正规方程的示例代码:

function theta = normal_equation(X, y)theta = (X' * X) \ (X' * y);
end

1.2.1.2 梯度下降法

梯度下降法是一种迭代解法,它通过沿着目标函数梯度的负方向更新参数向量,逐步逼近最优解。具体来说,对于上述线性最小二乘问题,梯度下降法的更新公式为:

θ = θ - α * ∇(sum((yi - θ^T * φ(xi))^2))

其中,α是学习率,用于控制梯度下降的步长;表示梯度。

下面是使用MATLAB实现梯度下降法的示例代码:

function theta = gradient_descent(X, y, alpha, num_iters)n = size(X, 1);m = size(X, 2) - 1;theta = zeros(m + 1, 1);for iter = 1:num_itersh = X * theta;theta = theta - alpha * (1 / n) * (X' * (h - y));end
end

2. 曲线拟合与函数逼近

曲线拟合和函数逼近是最小二乘优化的重要应用。在这部分,我们将介绍如何使用最小二乘优化方法进行曲线拟合和函数逼近。

2.1 曲线拟合

曲线拟合是指在一组已知数据点的基础上,寻找一条拟合曲线,使得数据点到拟合曲线的距离平方和最小。曲线拟合的方法有很多,例如线性回归、多项式回归、指数回归等。在本篇博客中,我们将主要介绍线性回归和多项式回归。

2.1.1 线性回归

线性回归是一种简单的曲线拟合方法,它假设待求的函数f(x)是关于输入数据x的线性函数。线性回归可以通过线性最小二乘法求解。

下面是使用MATLAB进行线性回归的示例代码:

function [theta, f] = linear_regression(x, y)X = [ones(size(x)), x];theta = normal_equation(X, y);f = @(x) [ones(size(x)), x] * theta;
end

2.1.2 多项式回归

多项式回归是一种更复杂的曲线拟合方法,它假设待求的函数f(x)是关于输入数据x的多项式函数。多项式回归可以通过线性最小二乘法求解。

下面是使用MATLAB进行多项式回归的示例代码:

function [theta, f] = polynomial_regression(x, y, m)X = ones(size(x, 1), m + 1);for i = 1:mX(:, i + 1) = x.^i;endtheta = normal_equation(X, y);f = @(x) polyval(theta(end:-1:1), x);
end

2.2 函数逼近

函数逼近是指在一组已知数据点的基础上,寻找一个函数,使得该函数在整个定义域内尽可能接近目标函数。函数逼近的方法有很多,例如插值方法(如拉格朗日插值、牛顿插值、样条插值等)、正交函数逼近(如傅里叶逼近、Legendre多项式逼近等)等。在本篇博客中,我们将主要介绍正交函数逼近。

2.2.1 正交函数逼近

正交函数逼近是一种基于正交函数系的函数逼近方法。它的基本思想是将目标函数表示成一组正交函数的线性组合,然后通过最小二乘优化方法求解各个正交函数的系数。

下面是使用MATLAB进行正交函数逼近的示例代码:

function [c, f] = orthogonal_function_approximation(x, y, phi)
n = length(x);
m = length(phi);
X = zeros(n, m);
for i = 1:mX(:, i) = phi{i}(x);
endc = normal_equation(X, y);
f = @(x) sum(c' .* cell2mat(cellfun(@(f) f(x), phi, 'UniformOutput', false)), 2);
end

3. 数学建模案例

在这部分,我们将通过一个数学建模案例,演示如何将上述方法应用于实际问题。

3.1 问题描述

假设我们正在研究某种疾病的传播情况。已知过去`n`天的感染人数数据`(x1, y1), (x2, y2), ..., (xn, yn)`,其中`xi`表示第`i`天,`yi`表示感染人数。我们希望找到一个函数`f(x)`,以描述这种疾病的传播趋势,并预测未来感染人数。

3.2 数据处理

首先,我们需要将已知数据转换成MATLAB可以处理的格式。假设我们已经将数据保存在一个文本文件中,每行包含两个数值,表示一天的`xi`和`yi`值。我们可以使用以下代码读取数据:

data = load('infection_data.txt');
x = data(:, 1);
y = data(:, 2);

3.3 函数拟合

我们可以尝试使用多项式回归方法对数据进行拟合。首先,我们需要确定多项式的阶数。我们可以通过计算不同阶数多项式的拟合误差,选择一个合适的阶数。以下代码展示了如何计算拟合误差:

max_order = 10;
errors = zeros(max_order, 1);for m = 1:max_order[~, f] = polynomial_regression(x, y, m);errors(m) = sum((y - f(x)).^2);
endplot(1:max_order, errors);
xlabel('Order');
ylabel('Error');

根据拟合误差的图像,我们可以选择一个合适的多项式阶数。然后,我们可以使用多项式回归方法对数据进行拟合:

m = 3; % 假设我们选择了3阶多项式
[theta, f] = polynomial_regression(x, y, m);

3.4 预测未来感染人数

根据拟合得到的函数f(x),我们可以预测未来感染人数。例如,我们想要预测未来一周内的感染人数,我们可以使用以下代码:

future_days = 7;
future_x = (max(x) + 1):(max(x) + future_days);
future_y = f(future_x);plot(x, y, 'o', future_x, future_y, '-');
xlabel('Day');
ylabel('Infection');
legend('Observed Data', 'Predicted Data');

4. 总结

在本篇博客中,我们详细介绍了最小二乘优化、曲线拟合与函数逼近的概念,原理以及在实际问题中的应用。我们使用MATLAB代码实现了线性最小二乘法的正规方程和梯度下降法,以及线性回归、多项式回归和正交函数逼近方法。通过一个数学建模案例,我们演示了如何将这些方法应用于实际问题。

在实际应用中,最小二乘优化、曲线拟合与函数逼近等方法在很多方面都有广泛的应用,如数据分析、信号处理、图像处理等。了解这些方法的原理和实现,对于解决实际问题具有很大的帮助。


http://www.ppmy.cn/news/109704.html

相关文章

C++ map类成员介绍 (map与multimap)

目录 🤔map模板介绍: 🤔特点: 🤔map容器与哈希表: 🤔map的成员函数: 🙂map构造函数: 代码示例: 运行结果: 🙂map赋…

陕西省养老服务人才培训基地申报条件范围、认定材料流程

今天为大家整理了陕西省养老服务人才培训基地申报条件范围、奖励措施等内容,感兴趣的朋友们可以了解一下! 如果想要申报西安市、宝鸡市、铜川市、咸阳市、渭南市、延安市、汉中市、榆林市、安康市、商洛市的项目政策,详情见下图 目标任务 陕…

spdk记录

spdk记录 hello_bdev命令行参数 往期文章: spdk环境搭建 hello_bdev 代码路径:examples/bdev/hello_world/hello_bdev.c 可执行文件路径:build/examples/hello_bdev 刚开始直接执行hello_bdev显示找不到Malloc0 ./build/examples/hello_b…

C++ vector模板和deque的简单应用

目录 🤔vector模板和deque的简单介绍: 🤔vector和deque的主要不同之处: 🤔今天我们用vector模板和deque模板实现以下简单的功能: 代码实现: 🤔讲解: 🤔vector模板和d…

代码随想录算法训练营第三十七天|738.单调递增的数字 968.监控二叉树

目录 LeeCode 738.单调递增的数字 LeeCode 968.监控二叉树 LeeCode 738.单调递增的数字 738. 单调递增的数字 - 力扣(LeetCode) 思路:从后向前遍历,遇到strNum[i - 1] > strNum[i]的情况,则strNum[i - 1]--&…

代码随想录算法训练营第四十一天|343. 整数拆分 96.不同的二叉搜索树

目录 LeeCode 343. 整数拆分 动态规划法 贪心解法 LeeCode 96.不同的二叉搜索树 LeeCode 343. 整数拆分 343. 整数拆分 - 力扣(LeetCode) 动态规划法 思路: 1.确定dp数组及下标含义:dp[i]:分拆数字i&#xff0…

git使用X篇_1_SVN和GIT的版本控制区别及git等的使用方法

GIT是分布式版本控制系统,可以在本地记录代码的修改过程而不一定上传至SVN服务端: 详细使用差异见博客: 版本控制:SVN和GIT的一些使用感受 版本控制:SVN和GIT的一些使用感受(续) git/svn_SVN和G…

Centos6.5环境Nginx 1.16.1升级到1.24.0版本

一、背景 2023年4月11日,官方发布了Nginx最新稳定版,版本号为 1.24.0。该版本是基于1.23.x(1.23.0 - 1.23.4)开发版的Bug修复,以及一些新特性的加入,而形成的稳定版。安全部门扫描后,发现现场不…