Помогите реализовать алгоритм наименьших квадратов в C [было: хочу найти квадратный корень из массива] - PullRequest
1 голос
/ 03 июля 2010

формула довольно сложная.числитель num, а знаменатель den, в формуле корень знаменателя, поэтому я поместил den в sqrrt (), но sqrrt принимает только double

#include<stdio.h>
#include<conio.h>
#include<math.h>
#define LEN 11
// for the following set of x and y find r by the formula ..
float sum(float arr[]);
void main(void)
{    int i;
    float x[]={43.22,39.87,41.85,43.23,40.06,53.29,53.29,54.14,49.12,40.71,55.15};
    float y[]={102.43,100.93,97.43,97.81,98.32,98.32,100.07,97.08,91.59,94.85,94.6};
    float num,den[LEN],r[LEN],xy[LEN],x2[LEN],y2[LEN];
    for(i=0;i<LEN;i++)
    {
        x2[i]=x[i]*x[i];
        y2[i]=y[i]*y[i];
        xy[i]=x[i]*y[i];
    }
    num=sum(xy)-sum(x)*sum(y);
    for(i=0;i<LEN;i++)
    {
        den[i]=((LEN*sum(x2)-(sum(x))*(sum(x)))*(LEN*sum(y2))-(sum(y2))*(sum(y2)));
        r[i]=num /sqrt(den);  /*<----------the problem is here-----> */

    }
    printf("%f",r);
    getch();
}
float sum(float arr[])
    {
    int i;
    float total=0;
    for(i=0;i<=LEN;i++)
    {
        total+=arr[i];
    }
    return total;
    }

Ответы [ 3 ]

4 голосов
/ 03 июля 2010

Из-за скуки я исправил твой код.Это все еще уродливо и крайне неэффективно, но компилируется и должно работать.Я оставлю тебя или кого-то еще, чтобы сделать его достойным.

#include <stdio.h>
#include <math.h>
#define LEN 11


// for the following set of x and y find r by the formula ..
float sum(float arr[]);
int main(void)
{ int i;
      float x[]={43.22,39.87,41.85,43.23,40.06,53.29,53.29,54.14,49.12,40.71,55.15};
      float y[]={102.43,100.93,97.43,97.81,98.32,98.32,100.07,97.08,91.59,94.85,94.6};


      float num,den,r[LEN],xy[LEN],x2[LEN],y2[LEN];
      for(i=0;i<LEN;i++)
          {
                x2[i]=x[i]*x[i];
                y2[i]=y[i]*y[i];
                xy[i]=x[i]*y[i];
              }
      num=LEN*sum(xy)-sum(x)*sum(y);
      den = (LEN*sum(x2)) - sum(x)*sum(x);

      float alpha = sum(y)/LEN - (num/den)*sum(x)/LEN;

      printf("beta = %f,  alpha = %f\n", num/den, alpha);     
      for(i=0;i<LEN;i++)
          {
            float term = y[i] - alpha - (num/den)*x[i];
            r[i] = (term*term);

                printf("%f",r[i]);
          }
}
float sum(float arr[])
  {
      int i;
      float total=0;
      for(i=0;i<=LEN;i++)
          {
                total+=arr[i];
              }
      return total;
      }
0 голосов
/ 03 июля 2010

Чтобы соответствовать остальной части кода, вы, вероятно, должны писать:

r[i] = num / sqrt(den[i]);

Однако расчет не тот, который я узнаю. Тело второго цикла будет выдавать один и тот же результат для каждого значения в den и, следовательно, также в r, что, вероятно, не то, о чем задавался вопрос.

0 голосов
/ 03 июля 2010

Вам нужно дать индекс den [i] в ​​знаменателе .... вместо этого в своем коде вы только что передали базовый адрес!

 r[i]=num /sqrt(den[i]);

Если это то, чего вы хотите достичь, что совершенно неясно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...