C# 从数据点c计算指数增长方程#
我试图使用C#应用程序分析一些数据,需要计算趋势线。我知道有多种类型的趋势线,但目前我正试图计算指数增长;我将用它来预测未来的价值。我一直在研究的方程是C# 从数据点c计算指数增长方程#,c#,visual-studio-2010,math,exponential,C#,Visual Studio 2010,Math,Exponential,我试图使用C#应用程序分析一些数据,需要计算趋势线。我知道有多种类型的趋势线,但目前我正试图计算指数增长;我将用它来预测未来的价值。我一直在研究的方程是 x(t) = x(0) * ((1+r)^t) 这是我为尝试复制图形而编写的代码: public void ExponentialBestFit(List<DateTime> xvalues, List<double> yvalues) { //Find the first v
x(t) = x(0) * ((1+r)^t)
这是我为尝试复制图形而编写的代码:
public void ExponentialBestFit(List<DateTime> xvalues, List<double> yvalues)
{
//Find the first value of y (The start value) and the first value of x (The start date)
xzero = Convert.ToDouble(xvalues[0].ToOADate());
yzero = yvalues[0];
if (yzero == 0)
yzero += 0.1;
//For every value of x (exluding the 1st value) find the r value
//
// | y | Where t = the time sinse the start time (time period)
//Equation for r = t root|-------| - 1 Where y = the current y value
// | y[0] | Where y[0] = the first y value #IMPROVMENT - Average 1st y value in range
//
double r = 0;
//c is a count of how many r values are added; it is not equal to the count of all the values
int c = 0;
for (int i = 1; i < xvalues.Count; i++)
{
r += Math.Pow(yvalues[i]/yzero, 1/(Convert.ToDouble(xvalues[i].ToOADate()) - xzero)) - 1;
c++;
}
r = r / c;
}
但是我想我不知道k值是从哪里产生的。我要传递的两个列表是日期和值,每个列表中的每一行对应于另一个列表中的同一行。问题是-有没有更好的方法来创建等式和变量?对于我的数据,我得到的变量是否最准确?下面的JavaScript代码应该会有所帮助。我用它来实现Excel的功能。它是用JavaScript编写的,但将其移植到C#应该很容易。请注意,其中大部分是由其他人编写的(代码中的学分)
函数增长(已知、已知、新、使用常数){
//字幕:伊尔马里卡罗宁
//可选参数的默认值:
if(typeof(known_x)=‘undefined’){
已知_x=[];
对于(var i=1;i以下JavaScript代码应该会有所帮助。我使用它来实现Excel的功能。它是用JavaScript编写的,但将其移植到C#应该非常容易。请注意,大部分代码是由其他人编写的(代码中的学分)
函数增长(已知、已知、新、使用常数){
//字幕:伊尔马里卡罗宁
//可选参数的默认值:
if(typeof(known_x)=‘undefined’){
已知_x=[];
对于(var i=1;i,这是提供的javascript的c版本
IEnumerable<double> Growth(IList<double> knownY, IList<double> knownX, IList<double> newX, bool useConst)
{
// Credits: Ilmari Karonen
// Default values for optional parameters:
if (knownY == null) return null;
if (knownX == null)
{
knownX = new List<double>();
for (var i = 0; i<=knownY.Count; i++)
knownX.Add(i++);
}
if (newX == null)
{
newX = new List<double>();
for (var i = 0; i <= knownY.Count; i++)
newX.Add(i++);
}
int n = knownY.Count;
double avg_x = 0.0;
double avg_y = 0.0;
double avg_xy = 0.0;
double avg_xx = 0.0;
double beta = 0.0;
double alpha = 0.0;
for (var i = 0; i < n; i++)
{
var x = knownX[i];
var y = Math.Log(knownY[i]);
avg_x += x;
avg_y += y;
avg_xy += x * y;
avg_xx += x * x;
}
avg_x /= n;
avg_y /= n;
avg_xy /= n;
avg_xx /= n;
// Compute linear regression coefficients:
if (useConst)
{
beta = (avg_xy - avg_x * avg_y) / (avg_xx - avg_x * avg_x);
alpha = avg_y - beta * avg_x;
}
else
{
beta = avg_xy / avg_xx;
alpha = 0.0;
}
// Compute and return result array:
return newX.Select(t => Math.Exp(alpha + beta*t)).ToList();
}
IEnumerable Growth(IList knownY、IList knownX、IList newX、bool useConst)
{
//字幕:伊尔马里卡罗宁
//可选参数的默认值:
如果(knownY==null)返回null;
if(knownX==null)
{
knownX=新列表();
对于(var i=0;i,这是提供的javascript的c版本
IEnumerable<double> Growth(IList<double> knownY, IList<double> knownX, IList<double> newX, bool useConst)
{
// Credits: Ilmari Karonen
// Default values for optional parameters:
if (knownY == null) return null;
if (knownX == null)
{
knownX = new List<double>();
for (var i = 0; i<=knownY.Count; i++)
knownX.Add(i++);
}
if (newX == null)
{
newX = new List<double>();
for (var i = 0; i <= knownY.Count; i++)
newX.Add(i++);
}
int n = knownY.Count;
double avg_x = 0.0;
double avg_y = 0.0;
double avg_xy = 0.0;
double avg_xx = 0.0;
double beta = 0.0;
double alpha = 0.0;
for (var i = 0; i < n; i++)
{
var x = knownX[i];
var y = Math.Log(knownY[i]);
avg_x += x;
avg_y += y;
avg_xy += x * y;
avg_xx += x * x;
}
avg_x /= n;
avg_y /= n;
avg_xy /= n;
avg_xx /= n;
// Compute linear regression coefficients:
if (useConst)
{
beta = (avg_xy - avg_x * avg_y) / (avg_xx - avg_x * avg_x);
alpha = avg_y - beta * avg_x;
}
else
{
beta = avg_xy / avg_xx;
alpha = 0.0;
}
// Compute and return result array:
return newX.Select(t => Math.Exp(alpha + beta*t)).ToList();
}
IEnumerable Growth(IList knownY、IList knownX、IList newX、bool useConst)
{
//字幕:伊尔马里卡罗宁
//可选参数的默认值:
如果(knownY==null)返回null;
if(knownX==null)
{
knownX=新列表();
对于(var i=0;i因为x(t)=x(0)*e^{kt}
,我们可以取对数得到lnx(t)=lnx(0)+kt
。这意味着要找到lnx(0)
和k
,你可以找到适合数据{(t,lnx(t))
。这将告诉你lnx(t)=b+at
,因此k=a
和x(0)=e^b因为x(t)=x(0)*e^{kt}
,我们可以取对数得到lnx(t)=lnx(0)+kt
。这意味着要找到lnx(0)
和k
,你可以找到适合数据的最小二乘法
。这将告诉你lnx(t)=b+at
,因此k=a
和x(0)=e^b
e^kt
与(r+1)^t
相同,只是有一个不同的常数(r=e^k-1
)-也就是说,我不担心Excel有不同的形式,你可以用这个公式来看看你是否得到与Excel相同的结果。@Rawling Ohh好的,谢谢你。我试图用70的规则来复制常数k,其中k=ln(2)/T和我得到了一条非常相似的线,尽管它的增长率稍高。我将尝试将这些图相互比较。干杯!e^kt
与(r+1)^T
相同,只是有一个不同的常数(r=e^k-1
)-也就是说,我不担心Excel有不同的形式,你可以用这个公式来看看你是否得到与Excel相同的结果。@Rawling Ohh好的,谢谢你。我试图用70的规则来复制常数k,其中k=ln(2)/T和我得到了一条非常相似的线,尽管它的增长率稍高。我会尝试将这些图相互比较。干杯!谢谢你的回答,我会尝试一下。非常感谢。谢谢你的回答,我会尝试一下。非常感谢。非常感谢,我在使用之前提供的JAV方面取得了一些成功A并将其与我的原始函数进行比较,它们看起来非常相似,但是我将尝试使用转换后的代码,看看图形是什么样子。Cheers只是想指出代码中使用“.Add(I++);”的位置应该更改为“.Add(I);”或者,您将加倍增加索引,从而产生更小的集合。尝试编辑答案以反映这一点,但编辑必须至少更改6个字符。:)非常感谢,我已经成功地使用了前面提供的JAVA,并将其与我的原始函数进行了比较,它们看起来非常相似,但是我将尝试使用您转换的代码,看看图形是什么样子。干杯只想指出代码中使用“.Add(I++”);”的位置应该更改为“.Add(I)“否则,您将加倍增加索引,从而产生更小的集合。尝试编辑答案以反映这一点,但编辑必须至少更改6个字符。:)
IEnumerable<double> Growth(IList<double> knownY, IList<double> knownX, IList<double> newX, bool useConst)
{
// Credits: Ilmari Karonen
// Default values for optional parameters:
if (knownY == null) return null;
if (knownX == null)
{
knownX = new List<double>();
for (var i = 0; i<=knownY.Count; i++)
knownX.Add(i++);
}
if (newX == null)
{
newX = new List<double>();
for (var i = 0; i <= knownY.Count; i++)
newX.Add(i++);
}
int n = knownY.Count;
double avg_x = 0.0;
double avg_y = 0.0;
double avg_xy = 0.0;
double avg_xx = 0.0;
double beta = 0.0;
double alpha = 0.0;
for (var i = 0; i < n; i++)
{
var x = knownX[i];
var y = Math.Log(knownY[i]);
avg_x += x;
avg_y += y;
avg_xy += x * y;
avg_xx += x * x;
}
avg_x /= n;
avg_y /= n;
avg_xy /= n;
avg_xx /= n;
// Compute linear regression coefficients:
if (useConst)
{
beta = (avg_xy - avg_x * avg_y) / (avg_xx - avg_x * avg_x);
alpha = avg_y - beta * avg_x;
}
else
{
beta = avg_xy / avg_xx;
alpha = 0.0;
}
// Compute and return result array:
return newX.Select(t => Math.Exp(alpha + beta*t)).ToList();
}