首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算数学相关函数/自相关函数的C程序

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

Stack Overflow用户
提问于 2013-08-19 17:54:46
回答 2查看 8.6K关注 0票数 3
代码语言:javascript
复制
#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);
}

我正试图编写一个计算值之间相关性的程序。我所拥有的数学函数是自相关函数或数学相关函数,即

代码语言:javascript
复制
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之间任意数量的值的文件,并找到它们之间的关联。稍后,我将担心如何将文件读取到数组的条目中,但首先,我想知道是否有一种使用数组进行此操作的逻辑方法?

例如,我试图做以下工作:

代码语言:javascript
复制
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(\τ)=\sum_{\tau_{0}=1}{m-τ}((\epsilon_{_0}*\epsilon_{\tau+\tau_{0})/m)- (\sum_{\tau_{0}=1}^m \epsilon_{\tau_{0}}/m)^2

该公式的另一种形式是:

G(\τ)= <\epsilon_{\tau_{0}}\epsilon_{\tau_{0}+\tau}>-<\epsilon_{\tau_{0}}>^2

哪里表示对a的期望。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-19 19:39:11

您要查找的C代码将以以下形式出现:

代码语言:javascript
复制
  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;

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

票数 1
EN

Stack Overflow用户

发布于 2013-08-19 19:11:56

这是一个如何阅读数学表达式的问题。在你的例子中,看起来是m= 5,所以之和永远不会超过这个值。

我对你的方程式不太清楚。已经试过Mathjax了,但是公式对我还不清楚,但是.

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

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

让这个对g(1)起作用。然后编写第三个for循环,包装或包围您刚刚开始工作的两个循环。这个循环将计算g(1),g(2),等等。如果m是5,并且只有5个数据点,那么只能计算g(1),如果m是6,则可以计算g(1)和g(2),等等。

希望这有帮助,如果您有更多的信息或问题,请张贴。

为了回答您的注释,下面的for循环实现了和或西格玛。请注意。这并不是您的代码应该做的,但它使用两个for循环进行演示。

代码语言:javascript
复制
   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;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18320051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档