灰色预测模型 c# 算法实现
public class GrayModel
{
private double a0, a1, a2;
private int size;
private double error; public GrayModel()
{
} public void build(double[] x0)
{
size = x0.Length;
double[] x1 = new double[size];
x1[0] = x0[0];
for (int i = 1; i < size; i++)
{
x1[i] = x0[i] + x1[i - 1];
}
double[,] b = new double[size - 1, 2];
double[,] bt = new double[2, size - 1];
double[,] y = new double[size - 1, 1];
for (int i = 0; i < b.GetLength(0); i++)
{
b[i, 0] = -(x1[i] + x1[i + 1]) / 2;
b[i, 1] = 1;
bt[0, i] = b[i, 0];
bt[1, i] = 1;
y[i, 0] = x0[i + 1];
}
double[,] t = new double[2, 2];
multiply(bt, b, t);
t = inverse(t);
double[,] t1 = new double[2, size - 1];
multiply(t, bt, t1);
double[,] t2 = new double[2, 1];
multiply(t1, y, t2);
a0 = t2[0, 0];
double u = t2[1, 0];
a2 = u / a0;
a1 = x0[0] - a2;
a0 = -a0; error = 0;
for (int i = 0; i < x0.Length; i++)
{
double d = (x0[i] - getX0(i));
error += d * d;
}
error /= x0.Length;
} /// <summary>
/// 误差
/// </summary>
/// <returns></returns>
public double getError()
{
return error;
} double getX1(int k)
{
return a1 * Math.Exp(a0 * k) + a2;
} double getX0(int k)
{
// return a0 * a1 * Math.exp(a0 * k);
if (k == 0)
return a1 * Math.Exp(a0 * k) + a2;
else
return a1 * (Math.Exp(a0 * k) - Math.Exp(a0 * (k - 1)));
} /// <summary>
/// 预测后续的值
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public double nextValue(int index)
{
if (index < 0)
throw new Exception("超出索引范围");
return getX0(size + index);
} /// <summary>
/// 预测下一个值
/// </summary>
/// <returns></returns>
public double nextValue()
{
return nextValue(0);
} static double[,] inverse(double[,] t)
{
double[,] a = new double[2, 2];
double det = t[0, 0] * t[1, 1] - t[0, 1] * t[1, 0];
a[0, 0] = t[1, 1] / det;
a[0, 1] = -t[1, 0] / det;
a[1, 0] = -t[0, 1] / det;
a[1, 1] = t[0, 0] / det;
return a;
} static void multiply(double[,] left, double[,] right, double[,] dest)
{
int n1 = left.GetLength(0);
int m1 = left.GetLength(1);
int m2 = right.GetLength(1);
for (int k = 0; k < n1; k++)
{
for (int s = 0; s < m2; s++)
{
dest[k, s] = 0;
for (int i = 0; i < m1; i++)
{
dest[k, s] += left[k, i] * right[i, s];
}
}
}
}
}
static void Main(string[] args)
{
double[] a=new double[]{2.874,3.278,3.337,3.390,3.679};
GrayModel gm = new GrayModel();
gm.build(a);
Console.WriteLine(gm.nextValue());
Console.Read();
}
灰色预测模型 c# 算法实现的更多相关文章
- 数学建模-灰色预测模型GM(1,1)_MATLAB
GM(1,1).m %建立符号变量a(发展系数)和b(灰作用量) syms a b; c = [a b]'; %原始数列 A A = [174, 179, 183, 189, 207, 234, 22 ...
- GM11灰色模型
作者:桂. 时间:2017-08-12 08:34:06 链接:http://www.cnblogs.com/xingshansi/p/7348714.html 前言 灰色模型(Gray model ...
- python 实现 灰色预测 GM(1,1)模型 灰色系统 预测 灰色预测公式推导
来源公式推导连接 https://blog.csdn.net/qq_36387683/article/details/88554434 关键词:灰色预测 python 实现 灰色预测 GM(1,1)模 ...
- R实现灰色预测
1.简介 预测就是借助于对过去的探讨去推测.了解未来.灰色预测通过原始数据的处理和灰色模型的建立,发现.掌握系统发展规律,对系统的未来状态做出科学的定量预测.对于一个具体的问题,究竟选择什么样的预测模 ...
- 灰色预测原理及JAVA实现
最近在做项目时,用户不想使用平均值来判断当前数据状态,想用其他的方式来分析数据的变化状态,在查找了一些资料后,想使用灰色预测来进行数据的预测.下面的内容是从网上综合下来的,java代码也做了一点改动, ...
- 【数学建模】灰色系统理论II-Verhulst建模-GM(1,N)-GM(2,1)建模
灰色系统理论中,GM(1,1)建模很常用,但他是有一定适应范围的. GM(1,1)适合于指数规律较强的序列,只能描述单调变化过程.对于具有一定随机波动性的序列,我们考虑使用Verhulst预测模型,或 ...
- [matlab] 21.灰色预测、线性回归分析模型与最小二乘回归 (转载)
灰色预测的主要特点是只需要4个数据,就能解决历史数据少,序列的完整性以及可靠性低的问题,能将无规律的原始数据进行生成得到规律性较强的生成序列,易于检验 但缺点是只适合中短期的预测,且只适合指数级增长的 ...
- 灰色预测--matlab&python实现
function SGrey X0 = input('请输入原始负荷数据:'); %输入原始数据 n = length(X0); %原始n年数据 %累加生成 X1 = zeros(1,n); for ...
- 深入解读《Gartner2017年商业智能和分析平台魔力象限报告》
文 | 帆软数据应用研究院 船长 2017年2月16日,Gartner发布了2017年BI商业智能和分析平台魔力象限报告,笔者这里进行一些解读,帮助大家更好了解市场状况和趋势. 一.几家欢笑几家愁 和 ...
随机推荐
- Where does beauty come from?
One more question, rational beauty should come from a dedicated brain and mind. Should there be more ...
- POJ 3241 Object Clustering(Manhattan MST)
题目链接:http://poj.org/problem?id=3241 Description We have N (N ≤ 10000) objects, and wish to classify ...
- bzoj4152 [AMPPZ2014]The Captain
最短路,先将x排序,然后把排序后权值相邻的点连边,再把y排序,也把权值相邻的点连边,求一遍1到n的最短路就好啦. 代码 #include<cstdio> #include<queue ...
- Codeforces Round #284 (Div. 1)
A. Crazy Town 这一题只需要考虑是否经过所给的线,如果起点和终点都在其中一条线的一侧,那么很明显从起点走点终点是不需要穿过这条线的,否则则一定要经过这条线,并且步数+1.用叉积判断即可. ...
- paper 4:支持向量机系列一: Maximum Margin Classifier —— 支持向量机简介。
支持向量机即 Support Vector Machine,简称 SVM .我最开始听说这头机器的名号的时候,一种神秘感就油然而生,似乎把 Support 这么一个具体的动作和 Vector 这么一个 ...
- iphone设置铃声
iphone同步铃声 1.下载itunes 2.打开itunes.文件->将文件添加到资料库...选择一首歌曲加进去 3.右击新加的歌曲,显示简介->选项.调整结束开始时间.不得超过40秒 ...
- java文件下载 rest
/** * 返回文件二进制 * */ @GET @Path("/excel") @Produces("application/vnd.ms-excel; charset= ...
- SQL——存储过程
1. 为什么使用存储过程 应用程序通过T-SQL语句到服务器的过程是不安全的. 1) 数据不安全 2)每次提交SQL代码都要经过语法编译后在执行,影响应用程序的运行性能 3) 网络流量大 2. 什么是 ...
- 实施费用也能DIY--走出软件作坊:三五个人十来条枪 如何成为开发正规军(九)[转]
上次咱们讲完了开发费用的计算,很多人在后面跟帖在那里算费用. 有人说:你把程序员都不当人,94天,一天都不休息啊. 我想答曰:94天,是工作时间.不算双休日在里面.也就是说,实际的开发周期长度是94+ ...
- 【GDI+】 线段 文字 定位的问题(二)
继续: 经过上文的分析,似乎可以得到类似这样的想法: 由此 分为左右两侧进行区分绘制,应该就可以获得想要的结果了~