C程序计算数学相关函数/自相关函数

时间:2013-08-19 17:54:47

标签: c arrays math correlation scientific-computing

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main () 
{
    double g_1, e_1, e_2, e_3, e_4, e_5; 
    int k;
   // double e[k];

        e_1 = 3.0;
    e_2 = 9.0;
    e_3 = 27.0;
    e_4 = 81.0;
    e_5 = 243.0;


    g_1 = ((e_1*e_2 + e_2*e_3 + e_3*e_4 + e_4*e_5)/5) - (((e_1)* + (e_2) + (e_3) +(e_4) + (e_5)/5)*((e_1)* + (e_2) + (e_3) +(e_4) + (e_5)/5));
printf("\n\n this is g(1): %f",g_1);


return (0);
}

我正在尝试编写一个计算值之间相关性的程序。我的数学函数是自相关函数或数学相关函数

g(T) = sum(from t = 1 to m-T) [ (e_t)*(e_(T+t)] - (sum(from t = 1 to m) [e_t/m] )^2

其中m是我拥有的值的数量。

上面我尝试通过取5个数字并将它们插入公式来做最简单的版本。但最终我需要能够读取包含100到5000之间任意数量值的文件,并找到它们之间的相关性。我会担心稍后将文件读入数组的条目但首先我想知道是否有使用数组的逻辑方法?

例如,我尝试执行以下操作:

e[1] = 3.0;
    e[2] = 9.0;
    e[3] = 27.0;
    e[4] = 81.0;
    e[5] = 243.0;

for(k=1;k<=5;k++)
    {   
        g[k]= ((e[k]*e[k+1] + e[k+1]*e[k+2] + e[k+2]*e[k+3] + e[k+3]*e[k+4])/5) - (((e[k] + e[k+1] + e[k+2] + e[k+3] + e[k+4])/5)*((e[k] + e[k+1] + e[k+2] + e[k+3] + e[k+4])/5))
             }

但这只对k = 1有意义,因为当它到达k = 5时,则k + 1将为6,k + 2将为7 ..并且我没有这些值。但是我不确定如何对此进行编程..任何人都可以帮忙吗?

谢谢

这是使用MathJax的公式

g(\ tau)= \ sum _ {\ tau_ {0} = 1} ^ {m- \ tau}((\ epsilon _ {\ tau {_ 0}} * \ epsilon _ {\ tau + \ tau_ {0}} )/ m) - (\ sum _ {\ tau_ {0} = 1} ^ m \ epsilon _ {\ tau_ {0}} / m)^ 2

该公式的另一种形式是:

g(\ tau)=&lt; \ epsilon _ {\ tau_ {0}} \ epsilon _ {\ tau_ {0} + \ tau}&gt; - &lt; \ epsilon _ {\ tau_ {0}}&gt; ^ 2

表示期望a。

2 个答案:

答案 0 :(得分:3)

这更像是如何阅读数学表达式问题。看起来在你的例子中,m = 5,所以总和从不参考。

我对你的等式并不完全清楚。尝试过Mathjax,但这个公式对我来说还不清楚,但是......

将数学表达式转换为代码时,请将求和符号(sigma)视为等效于for循环!

编写代码时,尽可能以最明确的方式编写(最初)。对于这个问题代码TWO for循环,一个接一个,不嵌套。每个for循环都执行g(k)计算的一部分。

让它适用于g(1)。然后编写第三个for循环,它包装或包围你刚刚工作的两个循环。该循环将计算g(1),g(2)等。注意。如果m是5并且你只有5个数据点那么你只能计算g(1),如果m是6你可以计算g(1)和g(2)等。

希望这有帮助,如果您有更多信息或问题,请发布。

要回答您的评论,以下for循环实现了sum或sigma。注意。这不是你的代码应该做的,但它使用两个for循环进行演示。

   int g1; x = 0; y = 0;
   int i;

   // compute x = sum(g(i)) + sum(f(i))

   // sum i = 0 to 2 [g(i)]
   for (i=0; i < 3; i++) {x += g[i];}

   // sum i = 0 to 1 [f(i)];
   for (i=0; i < 2; i++) {y += f[i];}

   g1 = x - y^2;

答案 1 :(得分:1)

您要查找的C代码将采用以下格式:

  int     tau = 7      
  int     m   = 80;
  double  *e; /* An array filled with m values */
  double  lhs,rhs,answer;
  int     tau0;

  /* Left Summation */
  for(sum=0,tau0=1; tau0 < m-tau; ++tau0)
    sum += e[tau0] * e[tau+tau0]; 
  lhs = sum / m;

  /* Right Summation */
  for(sum=0,tau0=1; tau0 < m; ++tau0)
    sum += e[tau0] / m;
  rhs = sum * sum;

  answer = lhs - rhs;

希望这可以让您更接近解决方案。