Форум программистов, компьютерный форум CyberForum.ru

Аппроксимация МНК для линейной, квадратической и экспоненциальной функции - C++

Восстановить пароль Регистрация
 
Yupas
0 / 0 / 0
Регистрация: 24.02.2014
Сообщений: 9
05.06.2014, 14:14     Аппроксимация МНК для линейной, квадратической и экспоненциальной функции #1
Здравствуйте. За ранее извиняюсь,наверное достал наших ув. программистов,т.к. за месяц это уже второе сообщение.В общем,буду как всегда краток. Даны табличные данные х и у
нужно написать программу которая будет апроксимировать эти данные для линейной,квадратической и експоненциальной функции.- Я нашел программу на Паскале,слегка ее модифицировал, и она работает прекрасно. Но вот беда,при попытке перевести ее на Язык С++(в среде Висуал студио(извините если не так написал) забадался фиксить мелкие баги и ошибочки. Вроде бы все исправил,но программа вообще отказываеться давать какой либо внятный результат. Прошу уважаемых программистов,помогите бедному ребенку с прогрммой.
Листинг программы на с++ прикладываю. Если кому в друг пригодиться,прикладываю рабочий код программы на Паскале(мне не жалко):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    setlocale( LC_ALL,"Russian" );
int const n=5;
int i,j;
double TArray[n];
double SumX,SumY,SumX2,SumXY,SumX3,SumX4,SumX2Y,SumLnY,SumXLnY;
 double OPRlin,OPRkvadr,OPRa1,OPRa2,OPRa3;
 double a1lin,a2lin,a1kvadr,a2kvadr,a3kvadr,a1exp,a2exp,cexp;
double Xsr,Ysr,S1,S2,S3,Slin,Skvadr,Sexp;
 double Kkor,KdetLin,KdetKvadr,KdetExp;
 char I;
double TArrayXY[2][n]={{0,1,2,4,5},{2.1,2.4,2.6,2.8,3.0}};
 for(int i=0;i<1;i++)
for (int j=0;j<n;j++)
cout<<"TArrayXY["<<i<<"]["<<j<<"]=";cin>>TArrayXY[i][j];
{
 SumX=0.0;
 SumY=0.0;
 SumXY=0.0;
 SumX2=0.0;
 SumX3=0.0;
 SumX4=0.0;
 SumX2Y=0.0;
 SumLnY=0.0;
 SumXLnY=0.0;
for(int i=0;i<1;i++)
for (int j=0;j<n;j++)
cout<<"TArrayXY["<<i<<"]["<<j<<"]=";cin>>TArrayXY[i][j]; 
  {
   for(i=0;i<n;i++)
{SumX=SumX+TArrayXY[0][i];
SumY=SumY+TArrayXY[1][i];
SumXY=SumXY+TArrayXY[0][i]*TArrayXY[1][i];
SumX2=SumX2+(TArrayXY[0][i]*TArrayXY[0][i]);
SumX3=SumX3+TArrayXY[0][i]*TArrayXY[0][i]*TArrayXY[0][i];
SumX4=SumX4+(TArrayXY[0][i]*TArrayXY[0][i])*(TArrayXY[0][i]*TArrayXY[0][i]);
SumX2Y=SumX2Y+(TArrayXY[0][i]*TArrayXY[0][i])*TArrayXY[1][i];
SumLnY=SumLnY+log(TArrayXY[1][i]);
SumXLnY=SumXLnY+TArrayXY[0][i]*log(TArrayXY[1][i]);}
  }
OPRlin=0.0;
 a1lin=0.0;
 a2lin=0.0;
 a1kvadr=0.0;
 OPRkvadr=0.0;
 a2kvadr=0.0;
 a2kvadr=0.0;
 a1exp=0.0;
 a2exp=0.0;
 OPRlin=n*SumX2-SumX*SumX;
 a1lin=(SumX2*SumY-SumX*SumXY)/OPRlin;
 a2lin=(n*SumXY-SumX*SumY)/OPRlin;
 OPRkvadr=n*SumX2*SumX4+SumX*SumX3*SumX2+SumX2*SumX*SumX3-     SumX2*SumX2*SumX2-n*SumX3*SumX3-SumX*SumX*SumX4;
 a1kvadr=(SumY*SumX2*SumX4+SumX*SumX2Y*SumX3+SumX2*SumXY*SumX3- SumX2*SumX2*SumX2Y-SumY*SumX3*SumX3-SumX*SumXY*SumX4)/OPRkvadr;
 a2kvadr=(n*SumXY*SumX4+SumY*SumX3*SumX2+SumX2*SumX*SumX2Y-SumX2*SumX2*SumXY-n*SumX3*SumX2Y-SumY*SumX*SumX4)/OPRkvadr;
 a3kvadr=(n*SumX2*SumX2Y+SumX*SumXY*SumX2+SumY*SumX*SumX3-SumY*SumX2*SumX2-n*SumXY*SumX3-SumX*SumX*SumX2Y)/OPRkvadr;
 a2exp=(n*SumXLnY-SumX*SumLnY)/OPRlin;
 cexp=(SumX2*SumLnY-SumX*SumXLnY)/OPRlin;
 a1exp=exp(cexp);
 
 Xsr=SumX/n;
 Ysr=SumY/n;
 S1=0.0;
 S2=0.0;
 S3=0.0;
 Slin=0.0;
 Skvadr=0.0;
 Sexp=0.0;
 Kkor=0.0;
 KdetLin=0.0;
 KdetKvadr=0.0;
 KdetExp=0.0;
 
 
  for(i=0;i<n;i++)
{using namespace std;
    S1=S1+(TArrayXY[0][i]-Xsr)*(TArrayXY[1][i]-Ysr);
S2=S2+(TArrayXY[0][i]-Xsr*TArrayXY[0][i]-Xsr);
S3=S3+(TArrayXY[1][i]-Ysr*TArrayXY[1][i]-Ysr);
Slin=Slin+(a1lin+a2lin*TArrayXY[0][i]-TArrayXY[1][i]*a1lin+a2lin*TArrayXY[0][i]-TArrayXY[1][i]);
Skvadr=Skvadr+(a1kvadr+a2kvadr*TArrayXY[0][i]+a3kvadr*TArrayXY[0][i]*TArrayXY[0][i]-TArrayXY[1][i]*a1kvadr+a2kvadr*TArrayXY[0][i]+a3kvadr*TArrayXY[0][i]*TArrayXY[0][i]-TArrayXY[1][i]);
Sexp=Sexp+(a1exp*exp(a2exp*TArrayXY[0][i])-TArrayXY[1][i]*a1exp*exp(a2exp*TArrayXY[0][i])-TArrayXY[1][i]);}
  Kkor=S1/sqrt(S2*S3);
 KdetLin=1-Slin/S3;
 KdetKvadr=1-Skvadr/S3;
 KdetExp=1-Sexp/S3;
cout<<"Линейная функция\n";
 cout<<"a1= "<<a1lin;
 cout<<"a2= "<<a2lin;
 cout<<"Квадратичная функция";
 cout<<"a1= "<<a1kvadr;
 cout<<"a2= "<<a2kvadr;
 cout<<"a3= "<<a3kvadr;
 cout<<"Экспоненциальная функция/n";
 cout<<"a1= "<<a1exp;
cout<<" a2= "<<a2exp;
cout<<" c= "<<cexp;
 cout<<"n ""Xcp= "<<Xsr;
 cout<<" Ycp= "<<Ysr;
 cout<<" Коэффициент корреляции" <<Kkor;
 cout<<" Коэффициент детерминированности (линейная аппроксимация)" <<KdetLin;
 cout<<"Коэффициент детерминированности (квадратическая аппроксимация)"<< KdetKvadr;
 cout<<"Коэффициент детерминированности (экспоненциальная аппроксимация)"<<KdetExp;
system("pause");
return 0;
}
}
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
uses winCRT;
const
n=5;
type
TArrayXY = array[1..2,1..n] of real;
TArray = array[1..n] of real;
var
 SumX,SumY,SumX2,SumXY,SumX3,SumX4,SumX2Y,SumLnY,SumXLnY: real;
 OPRlin,OPRkvadr,OPRa1,OPRa2,OPRa3:real;
 a1lin,a2lin,a1kvadr,a2kvadr,a3kvadr,a1exp,a2exp,cexp:real;
 Xsr,Ysr,S1,S2,S3,Slin,Skvadr,Sexp:real;
 Kkor,KdetLin,KdetKvadr,KdetExp:real;
 i:byte;
const
ArrayXY:TArrayXY=((0,1,2,4,5) , (2.1,2.4, 2.6, 2.8, 3.0));
 begin
 ClrScr;
 SumX:=0.0;
 SumY:=0.0;
 SumXY:=0.0;
 SumX2:=0.0;
 SumX3:=0.0;
 SumX4:=0.0;
 SumX2Y:=0.0;
 SumLnY:=0.0;
 SumXLnY:=0.0;
 { vichislenie symm x, y, x*y, x^2, x^3, x^4, (x^2)*y, Ln(y), x*Ln(y) }
 for i:=1 to n do
  begin
   SumX:=SumX+ArrayXY[1,i];
   SumY:=SumY+ArrayXY[2,i];
   SumXY:=SumXY+ArrayXY[1,i]*ArrayXY[2,i];
   SumX2:=SumX2+sqr(ArrayXY[1,i]);
   SumX3:=SumX3+ArrayXY[1,i]*ArrayXY[1,i]*ArrayXY[1,i];
   SumX4:=SumX4+sqr(ArrayXY[1,i])*sqr(ArrayXY[1,i]);
   SumX2Y:=SumX2Y+sqr(ArrayXY[1,i])*ArrayXY[2,i];
   SumLnY:=SumLnY+ln(ArrayXY[2,i]);
   SumXLnY:=SumXLnY+ArrayXY[1,i]*ln(ArrayXY[2,i])
  end;
 { vichislenie koeff}
 OPRlin:=0.0;
 a1lin:=0.0;
 a2lin:=0.0;
 a1kvadr:=0.0;
 OPRkvadr:=0.0;
 a2kvadr:=0.0;
 a2kvadr:=0.0;
 a1exp:=0.0;
 a2exp:=0.0;
 OPRlin:=n*SumX2-SumX*SumX;
 a1lin:=(SumX2*SumY-SumX*SumXY)/OPRlin;
 a2lin:=(n*SumXY-SumX*SumY)/OPRlin;
 OPRkvadr:=n*SumX2*SumX4+SumX*SumX3*SumX2+SumX2*SumX*SumX3-     SumX2*SumX2*SumX2-n*SumX3*SumX3-SumX*SumX*SumX4;
 a1kvadr:=(SumY*SumX2*SumX4+SumX*SumX2Y*SumX3+SumX2*SumXY*SumX3- SumX2*SumX2*SumX2Y-SumY*SumX3*SumX3-SumX*SumXY*SumX4)
 /OPRkvadr;
 a2kvadr:=(n*SumXY*SumX4+SumY*SumX3*SumX2+SumX2*SumX*SumX2Y-SumX2*SumX2*SumXY-n*SumX3*SumX2Y-SumY*SumX*SumX4)/OPRkvadr;
 a3kvadr:=(n*SumX2*SumX2Y+SumX*SumXY*SumX2+SumY*SumX*SumX3-SumY*SumX2*SumX2-n*SumXY*SumX3-SumX*SumX*SumX2Y)/OPrkvadr;
 a2exp:=(n*SumXLnY-SumX*SumLnY)/OPRlin;
 cexp:=(SumX2*SumLnY-SumX*SumXLnY)/OPRlin;
 a1exp:=exp(cexp);
 { vichislenie x i y }
 Xsr:=SumX/n;
 Ysr:=SumY/n;
 S1:=0.0;
 S2:=0.0;
 S3:=0.0;
 Slin:=0.0;
 Skvadr:=0.0;
 Sexp:=0.0;
 Kkor:=0.0;
 KdetLin:=0.0;
 KdetKvadr:=0.0;
 KdetExp:=0.0;
 
for i:=1 to n do
  begin
   S1:=S1+(ArrayXY[1,i]-Xsr)*(ArrayXY[2,i]-Ysr);
   S2:=S2+sqr(ArrayXY[1,i]-Xsr);
   S3:=S3+sqr(ArrayXY[2,i]-Ysr);
   Slin:=Slin+sqr(a1lin+a2lin*ArrayXY[1,i]-ArrayXY[2,i]);
Skvadr:=Skvadr+sqr(a1kvadr+a2kvadr*ArrayXY[1,i]+a3kvadr*ArrayXY[1,i]*ArrayXY[1,i]-ArrayXY[2,i]);
   Sexp:=Sexp+sqr(a1exp*exp(a2exp*ArrayXY[1,i])-ArrayXY[2,i]);
  end;
 { vichislenie korelyc i determinacii }
 Kkor:=S1/sqrt(S2*S3);
 KdetLin:=1-Slin/S3;
 KdetKvadr:=1-Skvadr/S3;
 KdetExp:=1-Sexp/S3;
 { vivod rezult }
 WriteLn('lineynaya');
 WriteLn('a1=',a1lin:8:5);
 WriteLn('a2=',a2lin:8:5);
 WriteLn('kvadr');
 WriteLn('a1=',a1kvadr:8:5);
 WriteLn('a2=',a2kvadr:8:5);
 WriteLn('a3=',a3kvadr:8:5);
 WriteLn('exp');
 WriteLn('a1=',a1exp:8:5);
 WriteLn('a2=',a2exp:8:5);
 WriteLn('c=',cexp:8:5);
 WriteLn('Xcp=',Xsr:8:5);
 WriteLn('Ycp=',Ysr:8:5);
 WriteLn('koef. korelyaciii ',Kkor:8:5);
 WriteLn('koef determin(lineynaya aprox) ',KdetLin:2:5);
 WriteLn('koef determin kvadr aprox) ',KdetKvadr:2:5);
 WriteLn('koef detrem exp aprox) ',KdetExp:2:5);
end.
еще раз прощу помощи)За ранее благодарен вам)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2014, 14:14     Аппроксимация МНК для линейной, квадратической и экспоненциальной функции
Посмотрите здесь:

Апроксимация функции МНК C++
C++ Заполнять массив особым образом (для МНК)
Апроксимация линейной функции С++ C++
C++ Напишите программу для вычисления значения экспоненциальной функции
C++ Составить программу построения графика линейной функции
C++ Построить график линейной функции
C++ Программы линейной структуры. Математические функции
Аппроксимация графически-заданной функции C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Yupas
0 / 0 / 0
Регистрация: 24.02.2014
Сообщений: 9
06.06.2014, 14:28  [ТС]     Аппроксимация МНК для линейной, квадратической и экспоненциальной функции #2
Апну тему) Вопрос все еще актуальный. помогите пожалуйста.
Yandex
Объявления
06.06.2014, 14:28     Аппроксимация МНК для линейной, квадратической и экспоненциальной функции
Ответ Создать тему
Опции темы

Текущее время: 14:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru