Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数据点c计算指数增长方程#_C#_Visual Studio 2010_Math_Exponential - Fatal编程技术网

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

我试图使用C#应用程序分析一些数据,需要计算趋势线。我知道有多种类型的趋势线,但目前我正试图计算指数增长;我将用它来预测未来的价值。我一直在研究的方程是

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();

    }