Автор: Пользователь скрыл имя, 11 Октября 2014 в 23:06, курсовая работа
Аппроксимация (от латинского "approximate" -"приближаться")- приближенное выражение каких-либо математических объектов (например, чисел или функций) через другие более простые, более удобные в пользовании или просто более известные. В научных исследованиях аппроксимация применяется для описания, анализа, обобщения и дальнейшего использования эмпирических результ.
В курсовой работе также представлены реализация расчетов апроксимации на языках программирования.
Введение………………………………………………..……………………..3
Глава 1. Теоретическая часть……………………….…………………….4
Глава 2. Практическая часть……………………………….………..…..18
Заключение………………………………………….………………………36
Список используемой литературы
Шаг 3. В ячейку K2 вводим формулу =(A2-$F$49)^2.
Шаг 4. В ячейки K3:K26 эта формула копируется.
Шаг 5. В ячейку L2 вводим формулу =(B2-$F$50)^2.
Шаг 6. В ячейки L3:L26 эта формула копируется.
Шаг 7. В ячейку M2 вводим формулу =($D$37+$D$38*A2-B2)^2.
Шаг 8. В ячейки M3:M26 эта формула копируется.
Шаг 9. В ячейку N2 вводим формулу
=($I$38+$I$39*A2+$I$40*A2^2-
Шаг 10. В ячейки N3:N26 эта формула копируется.
Шаг 11. В ячейку O2 вводим формулу
=($G$47*EXP($G$46*A2)-B2)^2.
Шаг 12. В ячейки O3:O26 эта формула копируется.
Последующие шаги делаем с помощью автосуммирования .
Шаг 13. В ячейку J27 вводим формулу =СУММ(J2:J26).
Шаг 14. В ячейку K27 вводим формулу =СУММ(K2:K26).
Шаг 15. В ячейку L27 вводим формулу =СУММ(L2:L26).
Шаг 16. В ячейку M27 вводим формулу =СУММ(M2:M26).
Шаг 17. В ячейку N27 вводим формулу =СУММ(N2:N26).
Шаг 18. В ячейку O27 вводим формулу =СУММ(O2:O26).
Теперь проведем расчеты коэффициента корреляции по формуле
(только для линейной
и коэффициента детерминированности по формуле . Результаты расчетов средствами Microsoft Excel представлены в таблице 8.
Таблица 8
Результаты расчета.
В таблице 8 в ячейке D53 записана формула =J27/(K27*L27)^(1/2).
В ячейке D54 записана формула =1- M27/L27.
В ячейке D55 записана формула =1- N27/L27.
В ячейке D56 записана формула =1- O27/L27.
Анализ результатов расчетов показывает, что квадратичная аппроксимация наилучшим образом описывает экспериментальные данные.
Рассмотрим результаты эксперимента, приведенные в исследованном выше примере.
Исследуем характер зависимости в три этапа:
Рис.4.1. График зависимости
y от x
Рис.4.2. График линейной аппроксимации
Рис.4.3. График квадратичной аппроксимации.
Рис.4.4. График экспоненциальной аппроксимации.
Часто многие инженерные задачи, задачи физики, геометрии и многих других областей человеческой деятельности приводят к необходимости вычислять аппроксимацию. Для это разрабатываются программы на процедурных языках, например Pascal.
Текст программы:
program Kramer;
uses CRT;
const
n=25;
type
TArrayXY = array[1..2,1..n] of real;
TArray = array[1..n] of real;
var
SumX,SumY,SumX2,SumXY,SumX3,
OPRlin,OPRkvadr,OPRa1,OPRa2,
a1lin,a2lin,a1kvadr,a2kvadr,
Xsr,Ysr,S1,S2,S3,Slin,Skvadr,
Kkor,KdetLin,KdetKvadr,
i:byte;
const
ArrayXY:TArrayXY=((12.85,12.
145.59,108.37,100.76,98.32,81.
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;
{ Вычисление сумм 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]*
SumX2:=SumX2+sqr(ArrayXY[1,i])
SumX3:=SumX3+ArrayXY[1,i]*
SumX4:=SumX4+sqr(ArrayXY[1,i])
SumX2Y:=SumX2Y+sqr(ArrayXY[1,
SumLnY:=SumLnY+ln(ArrayXY[2,i]
SumXLnY:=SumXLnY+ArrayXY[1,i]*
end;
{ Вычисление коэффициентов }
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)
a2lin:=(n*SumXY-SumX*SumY)/
OPRkvadr:=n*SumX2*SumX4+SumX*
a1kvadr:=(SumY*SumX2*SumX4+
a2kvadr:=(n*SumXY*SumX4+SumY*
a3kvadr:=(n*SumX2*SumX2Y+SumX*
a2exp:=(n*SumXLnY-SumX*SumLnY)
cexp:=(SumX2*SumLnY-SumX*
a1exp:=exp(cexp);
{ Вычисление средних арифметических x и 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)*(
S2:=S2+sqr(ArrayXY[1,i]-Xsr);
S3:=S3+sqr(ArrayXY[2,i]-Ysr);
Slin:=Slin+sqr(a1lin+a2lin*
Skvadr:=Skvadr+sqr(a1kvadr+
Sexp:=Sexp+sqr(a1exp*exp(
end;
{ Вычисление коэффициентов
Kkor:=S1/sqrt(S2*S3);
KdetLin:=1-Slin/S3;
KdetKvadr:=1-Skvadr/S3;
KdetExp:=1-Sexp/S3;
{ Вывод результатов }
WriteLn('Линейная функция');
WriteLn('a1=',a1lin:8:5);
WriteLn('a2=',a2lin:8:5);
WriteLn('Квадратичная функция');
WriteLn('a1=',a1kvadr:8:5);
WriteLn('a2=',a2kvadr:8:5);
WriteLn('a3=',a3kvadr:8:5);
WriteLn('Экспоненциальная функция');
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('Коэффициент корреляции ',Kkor:8:5);
WriteLn('Коэффициент детерминированности (линейная аппроксимация) ',KdetLin:2:5);
WriteLn('Коэффициент
WriteLn('Коэффициент
end.
Коэффициенты линейной функции
a1=-24.73516
a2=11.63471
Коэффициенты квадратичной функции
a1= 1.59678
a2=-0.62145
a3= 0.95543
Коэффициенты экспоненциальной функции
a1= 1.65885
a2= 0.40987
c= 0.50613
Xcp= 6.52320
Ycp=51.16040
Коэффициент корреляции 0.96196
Коэффициент детерминированности (линейная аппроксимация) 0.92537
Коэффициент детерминированности (квадратическая аппроксимация) 0.99409
Коэффициент детерминированности (экспоненциальная аппроксимация) 0.02691
Рис.5.1. Блок-схема
Результаты выполнения программы:
Сделаем заключение по результатам полученных данных:
1. Анализ
результатов расчетов
2. Сравнивая
результаты, полученные при помощи
функции ЛИНЕЙН видим что они
полностью совпадают с
3. Полученное
при построении линии тренда
значение коэффициента
4. Результаты полученные с помощью программы на языке PASCAL и Delphi полностью совпадают со значениями приведенными выше. Это говорит о верности вычислений.
ПРИЛОЖЕНИЕ
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Math, StdCtrls, Grids, Menus, ComCtrls, Buttons, TeEngine,
Series, ExtCtrls, TeeProcs, Chart, Unit2;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
Edit11: TEdit;
Edit12: TEdit;
Edit13: TEdit;
StatusBar1: TStatusBar;
MainMenu1: TMainMenu;
N1: TMenuItem;
StringGrid1: TStringGrid;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
Label20: TLabel;
Label21: TLabel;
Label22: TLabel;
Edit14: TEdit;
Edit15: TEdit;
Edit16: TEdit;
Edit17: TEdit;
Edit18: TEdit;
Edit19: TEdit;
Edit20: TEdit;
Edit21: TEdit;
Edit22: TEdit;
BitBtn1: TBitBtn;
Label23: TLabel;
Label24: TLabel;
Edit23: TEdit;
Edit24: TEdit;
Chart1: TChart;
Series1: TLineSeries;
Series2: TLineSeries;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
GroupBox1: TGroupBox;
Label25: TLabel;
Label26: TLabel;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
mas=array[1..9]of real;
var
Form1: TForm1;
n:byte;
x,y:mas;
implementation
//--Раздел условия------------
procedure sets(var x,y:mas);
begin
//Функция, заданная таблично
x[1]:=1; y[1]:=1.24;
x[2]:=1.5; y[2]:=1.74;
x[3]:=2; y[3]:=1.61;
x[4]:=2.5; y[4]:=2.16;
x[5]:=3; y[5]:=3.06;
x[6]:=3.5; y[6]:=2.88;
x[7]:=4; y[7]:=4.53;
x[8]:=4.5; y[8]:=5.4;
x[9]:=5; y[9]:=7.07;
end;
//----------------------------
procedure approximation(x,y:mas; n:byte; var xa,xh,xg,ya,yh,yg,zxa,zxh,zxg:
var p:real;
k,i:byte;
aaa,bbb,aa,bb,cc,dd1,dd2:mas;
function z(k:byte; a,b,x:real):real;
begin
case k of
1: Result:=a*x+b;
2: Result:=b*Power(x,a);
3: Result:=b*exp(a*x);
4: Result:=a*ln(x)+b;
5: Result:=a/x+b;
6: Result:=1/(a*x+b);
7: Result:=x/(b*x+a);
8: Result:=b*exp(a/x);
9: Result:=1/(a*ln(x)+b);
end;
end;
function fi1(k:byte; x:real):real;
begin
case k of
1: Result:=x;
2: Result:=ln(x);
3: Result:=x;
4: Result:=ln(x);
5: Result:=1/x;
6: Result:=x;
7: Result:=1/x;
8: Result:=1/x;
9: Result:=ln(x);
end;
end;
function zx(k:byte; xa,xh,xg:real):real;
begin
case k of
1: Result:=xa;
2: Result:=xg;
3: Result:=xa;
4: Result:=xg;
5: Result:=xh;
6: Result:=xa;
7: Result:=xh;
8: Result:=xh;
9: Result:=xg;
end;
end;
function dd(k,i:byte; y:mas):real;
begin
case k of
1: Result:=y[i];
2: Result:=ln(y[i]);
3: Result:=ln(y[i]);
4: Result:=y[i];
5: Result:=y[i];
6: Result:=1/y[i];
7: Result:=1/y[i];
8: Result:=ln(y[i]);
9: Result:=1/y[i];
end;
end;
function zzx(k:byte; a,b:real):string;
begin
case k of
1: Result:=FloatToStrF(a,fffixed,
2: Result:=FloatToStrF(b,fffixed,
3: Result:=FloatToStrF(b,fffixed,
4: Result:=FloatToStrF(a,fffixed,
5: Result:=FloatToStrF(a,fffixed,
6: Result:='1/('+FloatToStrF(a,
7: Result:='x/('+FloatToStrF(b,
8: Result:=FloatToStrF(b,fffixed,
9: Result:='1/('+FloatToStrF(a,
end;
end;
begin
xa:=(x[1]+x[n])/2;
xh:=sqrt(x[1]*x[n]);
xg:=(2*x[1]*x[n])/(x[1]+x[n]);
ya:=(y[1]+y[n])/2;
yh:=sqrt(y[1]*y[n]);
yg:=(2*y[1]*y[n])/(y[1]+y[n]);
//Находим все delta 1..9
for k:=1 to 9 do
begin
aa[k]:=0;
for i:=1 to n do
aa[k]:=aa[k]+(fi1(k,x[i])*fi1(
bb[k]:=0;
for i:=1 to n do
bb[k]:=bb[k]+fi1(k,x[i]);
cc[k]:=n;
dd1[k]:=0;
for i:=1 to n do
dd1[k]:=dd1[k]+(fi1(k,x[i])*
dd2[k]:=0;
for i:=1 to n do
dd2[k]:=dd2[k]+dd(k,i,y);
bbb[k]:=((aa[k]*dd2[k])-(bb[k]
aaa[k]:=(dd1[k]-bb[k]*bbb[k])/
delta[k]:=Abs(z(k,aaa[k],bbb[
end;
//Находим deltak
deltak:=delta[1];
k:=1;
for i:=2 to 9 do
if delta[i]<deltak then
begin
deltak:=delta[i];
k:=i;
end;
a:=aaa[k];
if k in [2,3,8] then
b:=exp(bbb[k])
else
b:=bbb[k];
aa0:=aa[k];
bb0:=bb[k];
cc0:=cc[k];
dd10:=dd1[k];
dd20:=dd2[k];
zz:=zzx(k,a,b);
for i:=1 to n do
zzz[i]:=z(k,a,b,x[i]);
p:=0;
for i:=1 to n do
p:=p+((zzz[i]-y[i])*(zzz[i]-y[
kvadra:=sqrt(p);
zxa:=z(k,a,b,xa);
zxh:=z(k,a,b,xh);
zxg:=z(k,a,b,xg);
end;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var i:byte;
begin
n:=StrToInt(Edit1.Text);
sets(x,y);
StringGrid1.RowCount:=n+1;
StringGrid1.Cells[1,0]:='x';
StringGrid1.Cells[2,0]:='y';
StringGrid1.Cells[3,0]:='z';
for i:=1 to n do
begin
StringGrid1.Cells[0,i]:=
StringGrid1.Cells[1,i]:=
StringGrid1.Cells[2,i]:=
StringGrid1.Cells[3,i]:='';
end;
Series1.Clear;
Series2.Clear;
for i:=1 to n do
Series1.AddXY(x[i],y[i]);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var xa,xh,xg,ya,yh,yg,zxa,zxh,zxg,
z:string;
delta,zz:mas;
i:byte;
begin
approximation(x,y,n,xa,xh,xg,
for i:=1 to n do
StringGrid1.Cells[3,i]:=
Edit2.Text:=FloatToStrF(xa,
Edit3.Text:=FloatToStrF(xh,
Edit4.Text:=FloatToStrF(xg,
Edit5.Text:=FloatToStrF(ya,
Edit6.Text:=FloatToStrF(yh,
Edit7.Text:=FloatToStrF(yg,
Edit8.Text:=FloatToStrF(zxa,
Информация о работе Аппроксимация функций. Выбор эмпирических формул