Форум программистов, компьютерный форум, киберфорум
Наши страницы

Квадратичная аппроксимация, ошибка при решении СЛАУ методом Гаусса - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Переделать с Delphi на C++ (алгоритм дефрагментации) http://www.cyberforum.ru/cpp-beginners/thread367756.html
Доброго времени суток! Есть код на Delphi, нужно переделать его под C++ (как вариант - C#). Буду очень признателен, если кто-нибудь поможет. program Project2; uses SysUtils; type T_fs = record ...
C++ не создавать консольное окно как MSVS 2010 в не создавать консольное окно? типа параметра -mwindows в gcc http://www.cyberforum.ru/cpp-beginners/thread367751.html
C++ Определите, лежат ли точки на одной прямой
1)Заданы три точки на плоскости: М с координатами(x1,y1), L с координатами(x2,y2), и H с координатами (x3,y3). Определите, лежат ли они на одной прямой. При отрицательном ответе определить вид...
лексический анализ..... C++
Составить таблицу терминальных символов (включая операции +, – = и объявление типов), таблицу литералов и таблицу идентификаторов, на основе которых спроектировать программу-сканер, который...
C++ gcc -std key http://www.cyberforum.ru/cpp-beginners/thread367716.html
============================================================== -std= какие параметры здесь можно указывать? что указать чтобы комлировался чистый С(все новшевства С++ запрещены)?...
C++ Не могу скомпилировать программу с libjpeg - новая проблема! Решил проблему с libjpeg. Я понял какой надо командной строкой пользоваться. Но появилась новая проблема. Таких ошибок несколько: Ошибка 1 error LNK2005: _free уже определен в... подробнее

Показать сообщение отдельно
лендер
46 / 46 / 2
Регистрация: 12.01.2010
Сообщений: 183

Квадратичная аппроксимация, ошибка при решении СЛАУ методом Гаусса - C++

17.10.2011, 16:12. Просмотров 2614. Ответов 1
Метки (Все метки)

всем привет, возникла проблема при квадратичной аппроксимации функции, в результате левые данные...
сама функция имеет вид у = х^0.25, а данные используемые для аппроксимации даны на отрезке х[1, 10) с шагом 0.5, + зашумленные
из подготовленных данных составляем СЛАУ, решаем ее, полученный результат подставляем в формулу: у = а1 + а2*х + а3*х*х, в итоге данные очень сильно отличаются, картинка ниже.

собстно сам код:
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
112
113
114
115
116
117
118
119
120
121
// функция решения слау методом Гаусса, а - матрица, х - куда пихать результат, н - порядок матрицы
// у нас везде нумерация начинается с 1 а не 0, тоисть для матрици 3х4(для нашой квадратичной 
// аппроксимации) матрица а будет 4х5, массив х будет из 4-х ячеек, н = 4), нулевые ячейки, рядки и .
//столбци не учитываются
 
void Gays( double **a, double *x, int n )
{
  int m = n+1;
  int i,j;
  for( i = 1 ; i < n-1 ; i++ )
    for( j = i ; j < m-1 ; j++ ){
      int t = i;
      while( t < n-1 )
      {
        a[t+1][j+1] -=a [t+1][i] / a[i][i] * a[i][j+1];
        t++;
      }
   }
 
   for(int i = n-1 ; i >= 1 ; i-- )
   {
     x[i] = a[i][m-1] / a[i][i];
     for( int j = m-2 ; j >= i && i > 1 ; j-- )
       a[i-1][m-1] -= a[i-1][j] * x[j];
   }
}
//-----------------------------------------------------------------------
// функция для аппроксимации
double fx2( double x ){ return( 0.0 + 0.0*x + pow(x, 0.25) ); }
//  функция для получения значения У при известных коефициентах(полученых полсле решения СЛАУ Гауссом) матрици
double fx2( double x, double a1, double a2, double a3 ){ return( a1 + a2*x + a3*x*x ); }
//---------------------------------------------------------------------------
 
void f()
{
  int n = 4;                               // порядок матрици+1 
  int m = n+1;
 
  double *k  = new double[m];
  double **a = new double*[n];
  for(int i=0;i<n;i++)
    a[i] = new double[m];
 
  double Xp = StrToFloat(  Edit2->Text ); //  Хр = 1
  double Xk = StrToFloat(  Edit3->Text ); //  Хк = 10
  double shag= StrToFloat( Edit4->Text );//  = 0.5
  int iter = (Xk-Xp)/shag;
 
  double *x = new double[ iter ];
  double *y = new double[ iter ];
 
 
  int moo = 0;
  for( double i = Xp ; i < Xk ; i+=shag )  //  получаем експерементальные данные( наша функция + шум )
  {
    x[moo] = i;
    y[moo] = fx2(i) + random(200)*0.001 - 0.1 ;
    moo++;
  }
    //-------------------
  double xi  = 0.0;
  double x2i = 0.0;
  double yi  = 0.0;
  double x3i = 0.0;
  double xyi = 0.0;
  double x4i = 0.0;
  double xy2i= 0.0;
 
 
  for( int i = 0 ; i < iter ; i++ ) // вычисляем данные для формирования матрици 
  {
    xi  += x[i];
    x2i += x[i]*x[i];
    yi  += y[i];
    x3i += x[i]*x[i]*x[i];
    xyi += x[i]*y[i];
    x4i += x[i]*x[i]*x[i]*x[i];
    xy2i += x[i]*y[i]*y[i];
  }
    
  //  заполняем матрицу как на картинке
  a[1][1] = iter;
  a[1][2] = xi;
  a[1][3] = x2i;
  a[1][4] = yi;
  a[2][1] = xi;
  a[2][2] = x2i;
  a[2][3] = x3i;
  a[2][4] = xyi;
  a[3][1] = x2i;
  a[3][2] = x3i;
  a[3][3] = x4i;
  a[3][4] = xy2i;
   //-------------------
 
 Gays( a, k, n );  // решаем СЛАУ(созданную матрицу) и резульрат пихаем в к
 
 for(int i = 1 ; i < n ; i++ )
   Memo1->Lines->Add( FloatToStr(k[i]) );  //печатаем полученные результаты
 
 Chart1->Series[1]->Clear();
 Chart1->Series[0]->Clear();
 Chart1->Series[2]->Clear();
 for( int i = 0 ; i < iter ; i++ )
    Chart1->Series[0]->AddXY(x[i],y[i]);  // рисуем экспериментальные данные
 
 for( double i = Xp ; i < Xk ; i += shag )
 {
    Chart1->Series[1]->AddXY(i, fx2(i) );                         // рисуем настоящее значение функции
    Chart1->Series[2]->AddXY(i, fx2(i,k[1], k[2], k[3] ));    // рисуем аппроксимуючу   функцию 
 }
 // в результате либерда, скрин с результатом ниже
 
     //-------------------
  delete []k;
  for(int i=0;i<n;i++)
    delete []a[i];
  delete []a;
 
}
//---------------------------------------------------------------------------

сам проект в архиве написан на шестом си билдере
0
Миниатюры
Квадратичная аппроксимация, ошибка при решении СЛАУ методом Гаусса  
Изображения
 
Вложения
Тип файла: rar 777.rar (412.1 Кб, 57 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru