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

  • Автор темы Programmer_Hard
  • Дата начала
P

Programmer_Hard

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

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

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

Код:
/* 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. Найдено в архиве, автор не я :)
 
P

Programmer_Hard

Гость
#3
сенк, только не совсем понял как ей пользоваться:ph34r:
может
для оценки коэффициентов уравнения регрессии воспользоваться методом наименьших квадратов (МНК).
получить слау(как кстати его получить ), решением которого буду коэф-ты m0, m1....
Или я ошибаюсь.
 
04.09.2006
2 566
2
#4
<!--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, для возврата из функции корней уравнения
 
P

Programmer_Hard

Гость
#5
спасибо, теперь понял :)
кстати уже написал свой класс