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

Метод наименьших квадратов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 47, средняя оценка - 4.89
sektor2009
3 / 3 / 0
Регистрация: 15.03.2009
Сообщений: 339
05.01.2012, 11:53     Метод наименьших квадратов #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
// 12.cpp: главный файл проекта.
 
#include "stdafx.h"
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<iostream>
#define len 50//степень аппроксиамации,размер матрицы& ...;
/*******************************Тестовая функция***************************/
double Tfunc(double a) //Паробола;
 {return (a*a);}
/***************************************************************************/
int i,j,k;         //для организации циклов;
int n;             //степень аппроксимации МНСП;
int m;             //Число разбиений ,m+1 число точек на [A,B];
double a[len][len+1];      //решаемая система - расширенная матрица;
double A,B;            //орезок-[A,B];
double c0[len];        //массив коэффициентов;
double cnst,h,x;
double Fn(double x,int n);//возращает знач.МНСП в точке X,n-степень апроксимации;
void pogrech(void);
void ipMatr(void);     //ввод матрицы;
void opMatr(void);     //вывод матрицы;
 
void main(void)
{double aa,bb;
ipMatr();
for(opMatr(),k=0;k<=n;k++)        //прямой ход метода Гаусса;
 {for(aa=fabs(a[k][k]),i=k,j=k+1;j<=n;j++)//поиск макс. ел-та;
    if(fabs(a[j][k])>aa){i=j;aa=fabs(a[j][k]);};
    if(aa<0)
      {printf("Система не имеет единственного решения!!!");
       getch();
   
      }
  for(j=k;(j<=n+1)&&(i!=k);j++)       //перестановка i-ой строки;
      {bb=a[k][j];
       a[k][j]=a[i][j];
       a[i][j]=bb;
      }
  for(aa=a[k][k],a[k][k]=1,j=k+1;j<=n+1;j++)//преобразование ведущей строки;
     a[k][j]=a[k][j]/aa;
  for(i=k+1;i<=n;i++)                   //метод Гаусса;
    for(bb=a[i][k],a[i][k]=0,j=k+1;(j<=n+1)&&(bb!=0);j++)
     a[i][j]=a[i][j]-bb*a[k][j];
 }
for(opMatr(),i=n;i>=0;c0[i]=aa,i--)     //Обратный ход метода;
   for(aa=a[i][n+1],j=n;j>=i+1;j--)
      aa=aa-a[i][j]*c0[j];
for(i=0;i<=n;printf("c%d=%10.15lf\n",i,c0[i]),i++);//вывод коэффициентов;
pogrech();
system("PAUSE");
 
}
void ipMatr(void)
 {
 setlocale(LC_ALL,"Russian");
 printf("Определите степень аппроксимации MNK\n n=");scanf("%d",&n);
 printf("Задайте отрезок [A,B]:\n A=");scanf("%lf",&A);
 printf(" B=");scanf("%lf",&B);
 cnst=B-A;
 printf("Введите число разбиений отрезка[A,B](min=1)\n m=");
 scanf("%d",&m);
 h=cnst/m;          //шаг разбиения;
 for(i=0;i<=n;i++)
    for(j=0;j<=n+1;j++)     //формирование a[i][j];
       {if(j<=n) a[i][j]=(pow(B,i+j+1)-pow(A,i+j+1))/(cnst*(i+j+1));
    else            //формирование B[i];
//поиск интеграла на дискретном множеств;
     {for(a[i][j]=0,x=A,k=0;(k<=m);k++,x=x+h)//формирование B[i];
         {a[i][j]=a[i][j]+Tfunc(x)*pow(x,i);}//сумма;
      a[i][j]=(a[i][j])/(m+1);       //нормировка;
     }
 
       }
 }
 
void opMatr(void)
 {for(i=0;i<=n;i++,printf("\n"))
     for(j=0;j<=n+1;j++)
       {if(j==n+1)printf("=%10.6lf",a[i][j]);else printf(" %10.7lf",a[i][j]); };
  printf("\n");
 }
 
double Fn(double x,int n)
 {double F=0;
  for(i=0;i<=n;i++)
   {F=F+c0[i]*pow(x,i);}
  return F;
  system("PAUSE");
 }
 
void pogrech(void)
 {double max,p,ps,del;
  max=fabs(Tfunc(A)-Fn(A,n));
  ps=pow(max,2);
  del=pow(Tfunc(A),2);
  for(x=A+h;x<=B;x+=h)
    {p=fabs(Tfunc(x)-Fn(x,n));
     if(p>max)max=p;
     ps=ps+pow(p,2);
     del=del+pow(Tfunc(x),2);
    }
  printf("\Погрешность приближения=%10.10lf\n",sqrt(ps/del));
  ps=sqrt(ps/(m+1));
  printf("Средняя практическая погрешность=%10.10lf\n",ps);
  printf("Maxимальная практическая погрешность=%10.10lf\n",max);
 }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2012, 11:53     Метод наименьших квадратов
Посмотрите здесь:

метод наименьших квадратов, решение системы Гауссом C++
метод наименьших квадратов C++
C++ портировать программу с графиком из Pascal в С++(метод наименьших квадратов)
C++ C++ Линейный Метод Наименьших Квадратов. ошибка в расчетах
МНК (Метод наименьших квадратов) C++
C++ Метод наименьших квадратов! (с Pascal на C++)
Метод наименьших квадратов C++
Метод наименьших квадратов C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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