2013-01-25 7 views
2

C# 애플리케이션을 사용하여 일부 데이터를 분석하려고하는데 추세선을 계산해야합니다. 추세선은 여러 유형이 있지만 현재 지수 성장을 계산하려고합니다. 미래 가치를 예측하기 위해 그것을 사용할 것입니다. 내가 떨어져 일하고있다 방정식은데이터 포인트에서 지수 성장 방정식 계산하기 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;   
     } 

내가 전달하고 데이터는 일정 기간 동안입니다 그러나 시간이 증가하는 증가는 동일하지 않습니다. 내가 Excel에서 차트를 만들 때 그들은 그러나 나는 k 값이에서 생성되는 아무 생각이

x(t) = x(0)*(e^kt) 

내가 생각하는 다른 공식을 사용합니다. 전달중인 두 목록은 날짜 및 값이며 각 목록의 각 행은 다른 목록의 동일한 행에 해당합니다. 질문은 - 방정식과 변수를 만드는 더 좋은 방법이 있으며 내 데이터에 대해 가장 정확 해지는 변수입니까?

+1

'e^kt'는 다른 상수 ('r = e^k - 1')만으로'(r + 1)^t'와 동일합니다. 즉 Excel이 다른 양식을 작성하고 해당 수식을 사용하여 Excel과 동일한 결과를 얻는 지 확인할 수 있습니다. – Rawling

+0

@ Rawling Ohh ok, 감사합니다. k = ln (2)/T의 70 규칙을 사용하여 상수 k를 복제하려고했지만 조금 더 성장했지만 매우 유사한 선을 얻습니다. 나는 그래프를 서로 비교하려고 노력할 것이다. 건배! – manicmonkey21421

답변

1

다음 JavaScript 코드가 도움이 될 것입니다. Excel의 GROWTH 기능을 구현하는 데 사용했습니다. JavaScript로 작성되었지만 C#으로 이식하는 것은 매우 쉬워야합니다. 그것의 대부분은 다른 사람이 작성한 것임을 유의하십시오 (코드의 크레디트).

function GROWTH(known_y, known_x, new_x, use_const) { 
    // Credits: Ilmari Karonen 

    // Default values for optional parameters: 
    if (typeof(known_x) == 'undefined') { 
    known_x = []; 
    for (var i = 1; i <= known_y.length; i++) known_x.push(i); 
    } 
    if (typeof(new_x) == 'undefined') { 
    new_x = []; 
    for (var i = 1; i <= known_y.length; i++) new_x.push(i); 
    } 
    if (typeof(use_const) == 'undefined') use_const = true; 

    // Calculate sums over the data: 
    var n = known_y.length; 
    var avg_x = 0; 
    var avg_y = 0; 
    var avg_xy = 0; 
    var avg_xx = 0; 
    for (var i = 0; i < n; i++) { 
    var x = known_x[i]; 
    var y = Math.log(known_y[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 (use_const) { 
    var beta = (avg_xy - avg_x*avg_y)/(avg_xx - avg_x*avg_x); 
    var alpha = avg_y - beta*avg_x; 
    } else { 
    var beta = avg_xy/avg_xx; 
    var alpha = 0; 
    } 

    // Compute and return result array: 
    var new_y = []; 
    for (var i = 0; i < new_x.length; i++) { 
    new_y.push(Math.exp(alpha + beta * new_x[i])); 
    } 
    return new_y; 
} 
+0

답장을 보내 주셔서 감사합니다. 그것의 많은 감사. – manicmonkey21421

3

이것은 제공된 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(); 

    } 
+0

고맙습니다. 이전에 제공된 JAVA를 사용하고 원래 함수와 비교해 보았지만 꽤 비슷하게 보였습니다. 그러나 변환 된 코드를 사용하여 그래프가 어떻게 보이는지보십시오. 건배 – manicmonkey21421

+0

그냥 코드에서 ".Add (i ++);" 이 (가) ".Add (i);로 변경되어야합니다." 또는 인덱스를 두 배로 늘리면 컬렉션이 작아집니다. 반영하도록 답변을 편집하려고했으나 편집 내용이 최소 6 자 이상 변경되어야합니다. :) – ASeale

0

x(t)=x(0)*e^{kt} 때문에, 우리는 ln x(t)=ln x(0) + kt을 얻을 대수를 취할 수 있습니다. 즉, ln x(0)k을 찾으려면 {(t,ln x(t))}에 맞는 최소 제곱합을 찾을 수 있습니다. 이 경우 ln x(t) = b + at이 표시되므로 k=ax(0)=e^b이됩니다.