2024美赛数学建模常用数学建模时间序列模型之——趋势外推预测方法

          趋势外推法是根据事物的历史和现时资料,寻求事物发展规律,从而推测出事物未来状况的一种比较常用的预测方法。利用趋势外推法进行预测,主要包括六个阶段:(a)选择应预测的参数;(b)收集必要的数据;(c)利用数据拟合曲线;(d)趋势外推;(e)预测说明;(f)研究预测结果在进行决策中应用的可能性。趋势外推法常用的典型数学模型有:指数曲线、修正指数曲线、生长曲线、包络曲线等。
6.1 指数曲线法
        一般来说,技术的进步和生产的增长,在其未达饱和之前的新生时期是遵循指数曲线增长规律的,因此可以用指数曲线对发展中的事物进行预测。指数曲线的数学模型为:

6.2 修正指数曲线法
利用指数曲线外推来进行预测时,存在着预测值随着时间的推移会无限增大的情况。这是不符合客观规律的。因为任何事物的发展都是有一定限度的。例如某种畅销产品,在其占有市场的初期是呈指数曲线增长的,但随着产品销售量的增加,产品总量接近于社会饱和量时。这时的预测模型应改用修正指数曲线。

例8 根据统计资料,某厂收音机连续15 年的销售量如表10。

计算的 MATLAB 程序如下:

function chanliang
clc,clear
global a b k
load xsh.txt %原始数据存放在纯文本文件xsh.txt 中
yt=xsh; n=length(yt);m=n/3
cf=diff(yt);
for i=1:n-2
bzh(i)=cf(i+1)/cf(i);
end
range=minmax(bzh)
s1=sum(yt(1:m)), s2=sum(yt(m+1:2*m)), s3=sum(yt(2*m+1:end))
b=((s3-s2)/(s2-s1))^(1/m)
a=(s2-s1)*(b-1)/(b*(b^m-1)^2)
k=(s1-a*b*(b^m-1)/(b-1))/m
y=yuce(1:18)
%************************************
%定义预测函数
%************************************
function y=yuce(t)
global a b k
y=k+a*b.^t;

6.3 Compertz 曲线

计算的 MATLAB 程序如下:

function chanliang2
clc,clear
global a b k
load xsh.txt %原始数据存放在纯文本文件xsh.txt 中
yt=log(xsh); n=length(yt);m=n/3;
s1=sum(yt(1:m)), s2=sum(yt(m+1:2*m)), s3=sum(yt(2*m+1:end))
b=((s3-s2)/(s2-s1))^(1/m)
a=(s2-s1)*(b-1)/(b*(b^m-1)^2)
k=(s1-a*b*(b^m-1)/(b-1))/m
a=exp(a)
k=exp(k)
y=yuce(1:18)
%************************************
%定义预测函数
%************************************
function y=yuce(t);
global a b k
y=k*a.^(b.^t);

6.4 Logistic 曲线(生长曲线)
生物的生长过程经历发生、发展到成熟三个阶段,在三个阶段生物的生长速度是不一样的,例如南瓜的重量增长速度,在第一阶段增长的较慢,在发展时期则突然加快,而到了成熟期又趋减慢,形成一条S 形曲线,这就是有名的Logistic 曲线(生长曲线),很多事物,如技术和产品发展进程都有类似的发展过程,因此Logistic 曲线在预测中有相当广泛的应用。

计算的 MATLAB 程序如下:
function chanliang3
clc,clear
global a b k
load xsh.txt %原始数据存放在纯文本文件xsh.txt 中
yt=1./xsh; n=length(yt);m=n/3;
s1=sum(yt(1:m)), s2=sum(yt(m+1:2*m)), s3=sum(yt(2*m+1:end))
b=((s3-s2)/(s2-s1))^(1/m)
a=(s2-s1)*(b-1)/(b*(b^m-1)^2)
k=(s1-a*b*(b^m-1)/(b-1))/m
y=yuce(1:18)
%************************************
%定义预测函数
%************************************
function y=yuce(t);
global a b k
y=1./(k+a*b.^t);

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,作为 AI,我并不具备代码编写和执行的能力。但是,我可以向您解释一下趋势的思路和流程。 趋势是一种基于历史数据的预测方法,适用于数据呈现出一定的趋势性和周期性的情况。它的思路是根据已有的数据,找到一条最能代表历史趋势的线性或非线性函数,并将该函数继续向未来,从而得到未来的预测值。 下面是一个简单的趋势的C++代码示例: ```c++ #include <iostream> #include <vector> #include <cmath> using namespace std; // 拟合函数 double fit_func(double x, double a, double b, double c) { return a * pow(x, 2) + b * x + c; } // 计算误差 double calc_error(vector<double> x, vector<double> y, double a, double b, double c) { double error = 0.0; int n = x.size(); for (int i = 0; i < n; i++) { double y_pred = fit_func(x[i], a, b, c); error += pow(y_pred - y[i], 2); } return error; } // 拟合曲线 void fit_curve(vector<double> x, vector<double> y, double &a, double &b, double &c) { double alpha = 0.001; // 学习率 int n = x.size(); double error = 0.0; for (int i = 0; i < 1000; i++) { // 迭代求解 double delta_a = 0.0, delta_b = 0.0, delta_c = 0.0; for (int j = 0; j < n; j++) { double y_pred = fit_func(x[j], a, b, c); delta_a += (y_pred - y[j]) * pow(x[j], 2); delta_b += (y_pred - y[j]) * x[j]; delta_c += y_pred - y[j]; } a -= alpha * delta_a / n; b -= alpha * delta_b / n; c -= alpha * delta_c / n; error = calc_error(x, y, a, b, c); if (error < 0.0001) break; // 当误差足够小时结束迭代 } } // 预测未来值 double predict(vector<double> x, vector<double> y, double a, double b, double c, int future) { double x_next = x[x.size() - 1] + 1; double y_next = fit_func(x_next, a, b, c); for (int i = 1; i < future; i++) { x_next++; y_next = fit_func(x_next, a, b, c); } return y_next; } int main() { vector<double> x = {1, 2, 3, 4, 5}; vector<double> y = {1.2, 2.4, 3.8, 4.5, 5.5}; double a = 0.0, b = 0.0, c = 0.0; fit_curve(x, y, a, b, c); cout << "拟合函数: y = " << a << "x^2 + " << b << "x + " << c << endl; cout << "预测值: " << predict(x, y, a, b, c, 3) << endl; return 0; } ``` 以上代码实现了一个基于二次函数的拟合曲线,并通过梯度下降求解最优参数。在预测时,根据已有的历史数据和拟合曲线预测未来3个单位时间的数值。 当然,实际应用中趋势可能需要更加复杂的模型和算,需要根据具体情况进行选择和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值