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

3
#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(τ) = ∑ τ0=1m−τ ((ετ0∗ετ+τ0)/m) − (∑ τ0=1m ετ0/m)^2
一个替代公式是:
g(τ) =<ετ0ετ0+τ>−<ετ0>^2
其中< >表示期望。

1
你能否编辑你的帖子,并使用MathJax定义你的自相关函数,以便数学倾向的人可以立即理解? - recursion.ninja
1
我以前从未做过这个,但我尝试添加它...似乎并没有显示为公式,无论如何,函数是这个:http://en.wikipedia.org/wiki/Correlation_function_(statistical_mechanics) 的第四行... 我的只是有求和符号的不同..我希望你现在明白我想说什么了.. - Maheen Siddiqui
@haccks http://en.wikipedia.org/wiki/Correlation_function_(statistical_mechanics) - Maheen Siddiqui
它在统计力学中被广泛使用,也许你听说过它被称为两点相关函数? - Maheen Siddiqui
1
@MaheenSiddiqui 我很抱歉,显然StackOverflow上没有启用MathJax。这太遗憾了!您仍然可以使用**此网站**来定义表示自相关函数的MathJax。然后编辑您的问题并添加表示自相关函数的MathJax。它不会在Stack Overflow上呈现,但我们可以将表达式复制并粘贴回其他网站,并正确呈现它。 - recursion.ninja
显示剩余6条评论
2个回答

3
这更像是一个阅读数学表达式的问题。在您的示例中,m = 5,因此总和从未超出该范围。
我对您的方程不是完全清楚。尝试了Mathjax,但公式仍然不清晰,但......
将数学表达式转换为代码时,请将求和符号(sigma)视为for循环的等效项!
编写代码时,尽可能以最明确的方式编写。对于这个问题,编写两个for循环的代码,一个在另一个之后,而不是嵌套。每个for循环都为g(k)的一部分进行计算。
先让其对g(1)有效。然后编写第三个for循环,它包装或包围您刚刚工作的两个循环。此循环将计算g(1),g(2)等。注意。如果m为5且您只有5个数据点,则只能计算g(1),如果m为6,则可以计算g(1)和g(2)等。
希望这可以帮助您,如果需要更多信息或有疑问,请发布。
为回答您的评论,以下for循环实现了求和或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;

谢谢您的回复。但是我不明白如何让它求和。例如,如果我要计算e(1) + e(2) + e(3),那么我应该怎么做呢?sum = 0 for(k=0;k<3;k++) for(n=0;n<3;n++) { sum = sum + e(n);}虽然您建议不要使用嵌套循环。另外,因为我的公式对您来说不太清楚,所以您说了最后一句话,因为对于5个数据点,您可以计算4个相关性。 - Maheen Siddiqui
@MaheenSiddiqui,根据您的评论添加了代码。为了我们的讨论,x += 1;x = x + 1;是相同的。 - JackCColeman
如果您想尝试粘贴以下内容: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 到hostmath.com,可能会更清晰一些。但是感谢您的回答,我觉得我可能懂了..也许.. - Maheen Siddiqui
好的,谢谢,我知道了。我会尝试一下,应该会成功!谢谢。 - Maheen Siddiqui
@MaheenSiddiqui,请问还有其他问题吗?并告诉我结果如何! - JackCColeman

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;

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

实际上,只需添加一个循环即可得到我需要的正确答案。非常感谢您的帮助! - Maheen Siddiqui
很高兴我能帮到你! - recursion.ninja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接