Математика : Аппроксимация экспериментальных зависимостей
Аппроксимация экспериментальных зависимостей
Задание 1
Данные давления водорода Н2 на линии насыщения приведены в таблице. Сделать аппроксимацию экспериментальных данных в виде степенной функции и многочлена первой степени. Произвести сравнительный анализ ошибки аппроксимации полученной двумя функциями.
Таблица 1
|
Ts,0К
|
32
|
33
|
34
|
35
|
36
|
37
|
38
|
39
|
|
|
Pмм рт. ст.
|
360,3
|
509,5
|
699,2
|
935,3
|
1223.7
|
1570,5
|
1981,8
|
2463,8
|
|
|
Аппроксимация экспериментальных зависимостей методом наименьших квадратов. Теоретические сведения
Пусть, в результате эксперимента получена зависимость.
Необходимо найти аналитическую формулу f = , которая аппроксимирует экспериментальную (табличную) зависимость.
Выберем зависимость в виде полинома 2 - й степени, т.е.
(1)
В выражении (1) коэффициенты , , подлежат определению, причем эти коэффициенты должны быть подобраны таким образом, чтобы зависимость наилучшим образом приближалась к экспериментальной зависимости. Пусть отклонение - различие между табличным значением в точке и значением аналитической функции в этой же самой точке, т.е.:
(2)
В соответствии с методом наименьших квадратов (МНК) наилучшими коэффициентами зависимости (1) будут такие, для которых сумма квадратов отклонений будет минимальной.
(3)
Используя необходимые условия существования экстремума для функций нескольких переменных , находим уравнение для определения коэффициентов зависимости (1).
(4)
Из условия (4) получим систему линейных алгебраических уравнений:
(5)
Решив систему (5) найдем коэффициенты аппроксимирующей зависимости (1).
Эффективным методом решения систем линейных алгебраических уравнений является матричный метод. Сущность его состоит в следующем.
Пусть А -- матрица коэффициентов системы уравнений, X -- вектор неизвестных, В -- вектор правых частей системы уравнений. Тогда решение системы уравнений в матричной форме будет иметь вид:
Х = А -1 В.
Правило Крамера
Если ранг матрицы совместной системы равен числу ее неизвестных, то система является определенной. Если число неизвестных системы совпадает с числом уравнений (m = n) и матрица системы невырожденная (det A ? 0), то система имеет единственное решение, которое находится по правилу Крамера:
В этих формулах ? = det А -- определитель системы, а ?k -- определитель, полученный из определителя системы заменой k-гo столбца столбцом свободных членов (k = 1, 2,..., n).
Решение системы трех линейных уравнений с тремя неизвестными можно выразить через определители:
, ,
Информационное обеспечение
Зависимость давления P водорода Н2 при различных температурах на линии насыщения приведены в таблице (1).
Для проведения анализа исходных данных с целью выбора вида аппроксимирующего многочлена построим график функции, заданной в табл.1. График приведен на рис.1.
Графическое отображение точек экспериментальных данных
Рис. 1. Экспериментальная зависимость P=f(T)
В результате анализа данных выберем в качестве аппроксимирующего многочлена параболу, заданную уравнением P2(x)=a0+a1x+a2x2.
Для определения коэффициентов a0, a1, a2 запишем систему уравнений вида
При составлении системы создадим вспомогательную таблицу данных (таблица 2).
Используя данные таблицы 2, систему уравнений (5) записываем в виде
В результате решения системы методом Крамера получаем следующие значения определителей:
detA = 56448;
detA1 = 1435933397;
detA2 = -94279012,8;
detA3 = 1564382,4;
Вычислив определители, рассчитываем значения коэффициентов:
a0 = detA1/ detA;
a1= detA2/detA;
a2 = detA3/ detA;
a0= 25438,1625;
a1= -1670,19226;
a2= 27,71369048.
Таким образом, искомый аппроксимирующий многочлен имеет вид:
(6)
Полученная аналитическая зависимость (6) обобщает экспериментальные данные табл.01.
Для оценки погрешности полученной зависимости составим таблицу значений P. Для этого определим давление P по формуле (6). Результаты внесем в таблицу 2.
Таблица 2
|
T
|
32
|
33
|
34
|
35
|
36
|
37
|
38
|
39
|
|
|
P
|
370,8291668
|
502,0267858
|
688,6518
|
930,7042
|
1228,1839
|
1581,091
|
1989,4256
|
2453,188
|
|
|
Для оценки точности параболической аппроксимации сравниваем значения Р из табл.01 и табл.2. Модуль разности соответствующих значений представляет P-погрешность аппроксимации, значения которой представлены в табл.3. В таблице приведена также относительная погрешность Р, равная отношению Р к Р.
Таблица 3
|
Т
|
32
|
33
|
34
|
35
|
36
|
37
|
38
|
39
|
|
|
Р
|
10,529
|
7,4732
|
0,5482
|
4,59583
|
4,4839
|
10,591
|
7,625
|
10,6125
|
|
|
P,%
|
2,8393578
|
1,4886087
|
1,5317
|
0,4938
|
0,36509
|
0,6699
|
0,38331
|
0,4326
|
|
|
Сравнительный анализ погрешностей показывает, что полученная аналитическая зависимость удовлетворительно обобщает исходные экспериментальные данные.
Для интегральной оценки аппроксимации можно использовать формулу:
На рис. 2 приведены два графика, один из которых построен по данным аппроксимации (табл. 2), а второй - по исходным данным (табл.01).
Сравнивая эти графики, можно также отметить удовлетворительную сходимость теоретических и экспериментальных данных.
Выберем в качестве аппроксимирующего многочлена линейную функцию.
Аппроксимируем данную табличную зависимость многочленом первой степени P1(x)=a0+a1x
Для определения коэффициентов а0 , а1 необходимо составить систему уравнений
Подставив данные таблицы в систему уравнений получим:
Находим а0 и а1 методом Крамера:
а0 = -9343,52, а1 = 297,4798
Следовательно, искомый аппроксимирующий многочлен имеет вид
P= - 9342,52 + 297,4798T (7)
Формула (7) является аналитической зависимостью, обобщающей экспериментальные данные табл. 01.
Для оценки линейной аппроксимации необходимо сравнить значения yi из табл. 4 со значениями, полученными по формуле (7) для всех точек (i=1, 2, ..., 8). Результаты сравнения представлены в таблице 5.
Таблица 5
Проанализировав табл.5 можно сделать вывод, формула (7) не является корректной аналитической зависимостью, обобщающей экспериментальные данные табл. 01.
На рис.3 приведены график функции (7) и исходные экспериментальные данные. Сравнительный анализ показывает неудовлетворительную сходимость теоретических и экспериментальных данных.
Рис.5.3. График линейного аппроксимирующего многочлена и исходные данные.
Текст программы
#include<iostream.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>
#include<stdio.h>
#define PATHTODRIVER "c:\egavga.bgi"
void GrafikPolinom(float, float, float, float, float, float );//Функция //построения графика полиномиальной аппроксимации экспериментальных данных
void GrafikLinear(float,float,float,float,float);//Функция построения
//графика линейной аппроксимации экспериментальных данных
void GRAPH_POINTS(float,float,float,float ); //Функция выводит на экран точки //экспериментальных данных
int GRAPH_MODE(); //Функция инициализации графического режима
void GRID(float, float);// Функция формирования координатной сетки
/*-------------------------------------------------------------------------*/
int main()
{ clrscr();
int n;
float tmpr,pwr; //текущие значения аргумента и функции
float discret; //дискретность изменения аргумента
float tn0, tn; //диапазон изменения аргумента tn0 - min, tn - max
float pn; //pn-max экспериментальное значение функции
float *dp = new float [n]; //Массив значений ошибок аппроксимации
float *P = new float [n]; //Массив значений //полученный аналитическим способом
float INTG = 0; //переменная, используемая в выражении //интегральной оценки аппроксимации
float A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0;
float detA,i, detA1, detA2, detA3, A0,A2,A3;
int answer;
Ввод значений экспериментальных данных */ cout<<" Input number double values "<<endl;
cin>>n;
cout << " ENTER ARGUMENT VALUE " << endl;
float *t = new float [n]; //Массив значений аргумента (в данном случае - температура)
float *p = new float [n]; //Массив значений функции исследуемого процесса for( i=0;i<n;i++) {cout<<"Enter T"<<(i+1)<<"="; cin>>t[i]; }
cout <<" ENTER EXPERIMENTAL FNCTION VALUE"<<endl; for(i=0;i<n;i++) {cout<<"Enter P"<<(i+1)<<"="; cin>>p[i]; }
L:
cout <<" FOR DRAWING POINTS PRESS <1>\n" ;
cout <<" FOR FIND APROCSIMATION POLINOM FUNCTION INPUT <2>\n" ;
cout <<" FOR FIND APROCSIMATION LINEAR FUNCTION INPUT <4>\n" ;
cout <<" FOR FIND DRAWING POLINOM FUNCTION INPUT <3>\n" ;
cout <<" FOR FIND DRAWING LINEAR FUNCTION INPUT <5>\n" ;
cout <<" FOR EXIST INPUT <0>\n" ;
cin>>answer;
/* Графическое отображение экспериментальных данных в виде точек зависимости P = f(t) на координатной плоскости */
if (answer ==1)
{
int regimen = GRAPH_MODE();
if(regimen == 5)
{ tn0 = t[0]; tn = t[n-1];//tn-max экспериментальное значение температуры (аргумента) pn = p[n-1];//pn-max экспериментальное значение функции
GRID(tn,pn);
for(i = 0;i<n;i++)
{
tmpr= t[i];
pwr = p[i];
setbkcolor(1);
GRAPH_POINTS( tn,pn,tmpr,pwr );
} getch () ; closegraph(); // выход из графического режима
}
else
{ cout<<" Error code regimen = "<<regimen<<endl; getch(); closegraph();
} goto L;
}
/* Расчет функции аппроксимации экспериментальных данных в виде полинома 2 - й степени */
if(answer ==2) { for( i=0;i<n;i++) { A = A + t[i]; B = B + p[i]; C = C + t[i]*p[i]; D = D + t[i]*t[i]; E = E + t[i]*t[i]*p[i]; F = F + t[i]*t[i]*t[i]; G = G + t[i]*t[i]*t[i]*t[i]; } //
cout<<"A = "<<A<<" B = "<<B<<endl; //
cout<<"C = "<<C<<" D = "<<D<<endl; //
cout<<"E = "<<E<<" F = "<<F<<endl; //
cout<<"G = "<<G<<endl; /*n,A,B,C,D,E,F,G - коэффициенты многочленов для системы уравнений вида: n*(a0) + A*(a1) + D*(a2) = B A*(a0) + D*(a1) + F*(a2) = C D*(a0) + F*(a1) + G*(a2) = E */ // Решаем систему методом Крамера detA = n*D*G + A*F*D + D*A*F - D*D*D - A*A*G - n*F*F; detA1 = B*D*G + C*F*D + E*A*F - E*D*D - C*A*G - B*F*F; detA2 = n*C*G + A*E*D + D*B*F - D*C*D - A*B*G - E*F*n; detA3 = n*D*E + A*F*B + D*A*C - D*D*B - A*A*E - F*C*n; // cout << " detA = " << detA << " detA1 = " << detA1 << endl; // cout << " detA2 = " << detA2 << " detA3 = " << detA3 << endl; cout << " A0 = " << (A0 = detA1/detA) << endl; cout << " A2 = " << (A2 = detA2/detA) << endl; cout << " A3 = " << (A3 = detA3/detA) << endl;
cout << "APROCSIMATION POLINOM:" << endl; A2=A2; A3 = A3; cout << "P = (" << A0<<")+(" << (A2) << ")*T + (" << (A3) << ")*T^2" <<endl; for ( i=0; i<n; i++) { P[i] = A0 + A2*t[i] + A3*t[i]*t[i]; cout<<"P["<<i<<"]="<<P[i]<<" "; } cout<<"\n";
cout << " THE ABSOLUTE & RELATIVE MISTAKES OF APROCTIMATION \n"; for ( i=0; i<n; i++) { dp[i] = (P[i]-p[i]); cout<< "dP["<<i<<"]="<<(fabs(dp[i]))<<" dP(%)="<<(100*fabs(dp[i])/p[i])<<endl; }
cout <<" INTEGRAL LEVEL OF APROCTIMATION IS:\n" ;
for ( i=0; i<n; i++) { INTG = INTG + (dp[i])*dp[i]; } float ITG = sqrt(INTG/(n+1)); cout<<"ITG = "<<ITG<<"\n"; //интегральная оценка аппроксимации getch();
goto L; }
/* Графическое отображение, полученной зависимости P = f(t) в виде полинома 2 степени, на координатной плоскости */
if(answer == 3) {
int regimen = GRAPH_MODE();
if(regimen == 5)
{ tn0 = t[0]; tn = t[n-1];//tn-max экспериментальное значение температуры (аргумента) pn = p[n-1];//pn-max экспериментальное значение функции
GRID(tn,pn);
setbkcolor(1);
GrafikPolinom(A0, A2, A3,tn0,tn,pn );
for(i = 0;i<n;i++)
{
tmpr= t[i];
pwr = p[i];
GRAPH_POINTS( tn,pn,tmpr,pwr );
} getch () ; closegraph(); // выход из графического режима
}
else
{ cout<<" Error code regimen = "<<regimen<<endl; cout << "Dont find driver or driver damaged\n" ; /*В этом месте cделать возврат в главное меню*/ getch(); closegraph();
}
goto L;
}
/*-------------------------------------------------------------------------*/ /* Расчет линейной функции аппроксимации экспериментальных данных */ cout<<" II. LINEAR APROCTIMATION " <<endl; float R = 0, R2 = 0, B0, B1; float SCp = 0, Cpi = 0, detB, detB1, detB2; float* dCp = new float [n];; float* ACp = new float [n];; float INTGL = 0; if(answer == 4) { for ( i=0;i<n;i++) { R = R+t[i]; SCp = SCp + p[i]; R2 = R2 + t[i]*t[i]; Cpi = Cpi + p[i]*t[i]; } // cout << " R =" << R << " SCp =" << SCp << endl; // cout << " R2 =" << R2 << " Cpi =" << Cpi << endl; /*n, R, SCp, R2, Cpi - коэффициенты в уравнениях для системы вида (А0)*n + (A1)*R = SCp (A0)*R + (A1)*R2 = Cpi */ detB = n*R2 - R*R; detB1 = SCp*R2 - R*Cpi; detB2 = n*Cpi - R*SCp; // cout<<"detB = "<<detB<<" detB1 = "<<detB1<<"detB2 = "<<detB2<<"\n"; B0 = detB1/detB; B1 = detB2/detB; // cout << " B0 =" << B0 << endl; // cout << " B1 =" << B1 << endl; cout << " APROCTIMATION LINEAR POLINOM" << endl; cout<<"F =("<<B0<<") + ("<<B1<<")*T" << endl; for (i = 0; i<n;i++) { ACp[i] = B0 + B1* t[i]; cout <<"ACp["<<i<<"]=" <<ACp[i]<<endl; } for ( i = 0; i<n;i++) { dCp[i] = ACp[i] - p[i]; cout<< "dCp["<<i<<"]="<<(fabs(dCp[i]))<<" dCp(%)="<<(100*fabs(dCp[i])/p[i])<<endl; } cout <<" INTEGRAL LEVEL OF APROCTIMATION IS:\n" ; for ( i=0; i<n; i++) { INTGL = INTGL + (dCp[i])*(dCp[i]); } float ITGL = sqrt(INTGL/(n+1)); cout<<"ITGL = "<<ITGL<<"\n"; cout<<" "<<"\n"; getch(); goto L; }
Графическое отображение, полученной зависимости P = f(t) в виде линейной функции аппроксимации на, координатной плоскости */
if(answer==5)
{
int regimen = GRAPH_MODE();
if(regimen == 5)
{ tn0 = t[0]; tn = t[n-1]; tn = t[n-1]; pn = p[n-1]; GRID(tn,pn);
setbkcolor(1);
GrafikLinear( B0,B1,tn0,tn,pn );
for(i=0;i<n;i++)
{tmpr = t[i]; pwr = p[i]; GRAPH_POINTS(tn,pn,tmpr,pwr);
} getch () ; closegraph(); // выход из графического режима
}
else
{ cout << " Error code regimen = "<<regimen<<endl; cout << "Dont find driver or driver damaged\n" ; getch();
} goto L;
|