Регрессионный анализ

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем Programmer_Hard, 15 ноя 2007.

  1. Programmer_Hard

    Programmer_Hard Гость

    Все здравствуйте!
    Нужно найти уравнение регрессии вида y=m0+m1x1+m2x2+m3x3. Те найти уравн-е зависимости пере-й у от трех перем-х x1,x2,x3. Те для этого имеется массив Y[100] и массив Х[100][3]. Мне интересно есть ли класс который бы выдал мне m0,m1,m2,m3. Я давно писал такую прогу без классов - сейчас не могу разобраться в ней :)
    Буду благодарен и за ссылки на описание алгоритма
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Решение кубического уравнения методом Виета-Кардано.

    Формулы Кардано и Виета требуют применения специальных функций, и в том случае, когда требуется провести большую серию вычислений корней кубического уравнения с не слишком сильно меняющимися коэффициентами, более быстрым алгоритмом является использование метода Ньютона или других итерационных методов (с нахождением начального приближения по формулам Кардано-Виета).

    Ниже расположена программа для нахождения корней кубического уравнения с действительными коэффициентами.

    Код (Text):
    /* Cubic equation solution. Real coefficients case.

    int Cubic(double *x,double a,double b,double c);
    Parameters:
    x - solution array (size 3). On output:
    3 real roots -> then x is filled with them;
    1 real + 2 complex -> x[0] is real, x[1] is real part of
    complex roots, x[2] - non-negative
    imaginary part.
    a, b, c - coefficients, as described
    Returns: 3 - 3 real roots;
    1 - 1 real root + 2 complex;
    2 - 1 real root + complex roots imaginary part is zero
    (i.e. 2 real roots).
    */

    #include <math.h>  /* for sqrt(), fabs(), pow(), cos(), acos(). */
    #define M_PI (3.141592653589793)
    #define M_2PI (2.*M_PI)

    int Cubic(double *x,double a,double b,double c) {
    double q,r,r2,q3;
    q=(a*a-3.*b)/9.; r=(a*(2.*a*a-9.*b)+27.*c)/54.;
    r2=r*r; q3=q*q*q;
    if(r2<q3) {
    double t=acos(r/sqrt(q3));
    a/=3.; q=-2.*sqrt(q);
    x[0]=q*cos(t/3.)-a;
    x[1]=q*cos((t+M_2PI)/3.)-a;
    x[2]=q*cos((t-M_2PI)/3.)-a;
    return(3);
    }
    else {
    double aa,bb;
    if(r<=0.) r=-r;
    aa=-pow(r+sqrt(r2-q3),1./3.);
    if(aa!=0.) bb=q/aa;
    else bb=0.;
    a/=3.; q=aa+bb; r=aa-bb;
    x[0]=q-a;
    x[1]=(-0.5)*q-a;
    x[2]=(sqrt(3.)*0.5)*fabs(r);
    if(x[2]==0.) return(2);
    return(1);
    }
    }
    P.S. Найдено в архиве, автор не я :)
     
  3. Programmer_Hard

    Programmer_Hard Гость

    сенк, только не совсем понял как ей пользоваться:ph34r:
    может
    для оценки коэффициентов уравнения регрессии воспользоваться методом наименьших квадратов (МНК).
    получить слау(как кстати его получить ), решением которого буду коэф-ты m0, m1....
    Или я ошибаюсь.
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Programmer_Hard+16:11:2007, 17:05 -->
    <span class="vbquote">(Programmer_Hard @ 16:11:2007, 17:05 )</span><!--QuoteEBegin-->только не совсем понял как ей пользоваться
    [snapback]86128" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Усли уравнение имеет вид x3+a*x2+b*x+c=0, то передаешь в функцию соответствующие коэффициенты a, b и c, а также указатель на массив из 3 double, для возврата из функции корней уравнения
     
  5. Programmer_Hard

    Programmer_Hard Гость

    спасибо, теперь понял :)
    кстати уже написал свой класс
     
Загрузка...

Поделиться этой страницей