Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Звіт
про виконання лабораторної роботи № 1
з дисципліни: „Моделювання процесів
та елементів систем керування”
на тему: „ Поліноміальна апроксимація
нелінійних характеристик елементів ”
Варіант № 20
Виконав:
студент групи КС-43
Перевірив:
Павельчак А.Г.
Львів 2008
Мета роботи – вивчити методи наближення нелінійних характеристик елементів систем керування поліноміальними функціями, а саме: поліномами Лагранжа, Тейлора та кубічними сплайнами; навчитися записувати програми у вигляді універсальних процедур для апроксимації нелінійних характеристик.
Завдання
Завдання для лабораторної роботи дають із зазначенням номера апроксимуючої функції та варіанта чисельних значень координат вузлів апроксимації. В даній роботі необхідно виконати апроксимацію кривої намаґнечування. Крива намаґнечування задається двома точками, що відділяють лінійні зони від нелінійної (рис. 1). Координати цих точок позначені А(і1, 1), В(і2, 2). Для того, щоб виконати апроксимацію ділянки АВ поліномом, необхідні ще значення похідних в точках А, В. Для першої точки (А) похідна визначається безпосередньо за значеннями функції і аргументу у вузлі
m1 = i1/1,
а для другої точки (В) похідна m2 задана. Тоді рівняння лінійної ділянки ОА визначається рівнянням прямої, що проходить через початок координат
i() = m1
Рівняння ділянки ВС описує зону насичення феромаґнетного осердя яку також можна вважати лінійною, тому
i() = m2 + i0,
де вільний член і0 визначаємо за формулою
i0 = i2 - m22 .
Таким чином, криву намаґнечування апроксимуємо виразом з вибором розрахункової формули, в якій є два рівняння прямої і одна нелінійна функція
Вирази для апроксимуючих функцій
4.
Варіанти чисельних значень вузлів апроксимації
Таблиця 1
N п/п
6
1.7
17
5.1
91
11
Блок-схема
Список ідентифікаторів констант, змінних, процедур і функцій, використаних у
блок-схемі алгоритму і програмі, та їх пояснення.
h1 – крок табулювання.
a0, a1,a2,a3 – коефіцієнти апроксимуючої функції.
i1=i1,i2=i2,si1=Ψ1,si2= Ψ2,m1,m2,h – задані велечини.
Ψ – змінна величина.
Текст програми
Форма
Програма
#include <vcl.h>
#include <math.h>
#include <dstring.h>
#include <stdio.h>
#include <windows.h>
#include <string.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
double x1, x2,y1,y2,m2,h,start,finish;
double a[4];
double Matrix[4][4];
double Y[4];
double X[4];
//---------------------------------------------------------------------------
void gaus(void)
{
double V[4][4], C[4][4],P[4];
int i,j,k;
double DY;
for(i=0;i<4;i++)
{
P[i]=Y[i];
for (j=0;j<4;j++)
V[i][j]=Matrix[i][j];
}
for (k=0;k<4;k++)
{
Y[k]=P[k]/V[k][k];
for (i=k+1; i<4; i++)
{
P[i]=P[i]-V[i][k]*Y[k];
for (j=k+1; j<4; j++)
{
C[k][j]=V[k][j]/V[k][k];
V[i][j]=V[i][j]-V[i][k]*C[k][j];
}
}
}
a[3]=Y[3];
for(i=4-2;i>=0;i--)
{
DY=0;
for(j=i+1; j<4; j++)
DY+=C[i][j]*a[j];
a[i]=Y[i]-DY;
}
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit5Change(TObject *Sender)
{
float A;
try
{
A=StrToFloat(Edit5->Text);
x2=A;
}
catch (EConvertError&)
{
ShowMessage("Ви ввели помилкове число, повторіть ввід");
}
A=A*1.1;
Edit11->Text=FloatToStr(A);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
try
{
x1=StrToFloat(Edit1->Text);
}
catch (EConvertError&)
{
ShowMessage("Ви ввели помилкове число, повторіть ввід ");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2Change(TObject *Sender)
{
try
{
y1=StrToFloat(Edit2->Text);
}
catch (EConvertError&)
{
ShowMessage("Ви ввели помилкове число, повторіть ввід ");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit4Change(TObject *Sender)
{
try
{
y2=StrToFloat(Edit4->Text);
}
catch (EConvertError&)
{
ShowMessage("Ви ввели помилкове число, повторіть ввід ");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit3Change(TObject *Sender)
{
try
{
m2=StrToFloat(Edit3->Text);
}
catch (EConvertError&)
{
ShowMessage("Ви ввели помилкове число, повторіть ввід ");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit9Change(TObject *Sender)
{
try
{
h=StrToFloat(Edit9->Text);
}
catch (EConvertError&)
{
ShowMessage("Ви ввели помилкове число, повторіть ввід ");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit10Change(TObject *Sender)
{
try
{
start=StrToFloat(Edit10->Text);
}
catch (EConvertError&)
{
ShowMessage("Ви ввели помилкове число, повторіть ввід ");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit11Change(TObject *Sender)
{
try
{
finish=StrToFloat(Edit11->Text);
}
catch (EConvertError&)
{
ShowMessage("Ви ввели помилкове число, повторіть ввід ");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
FILE *F;
if ((F = fopen("Text.txt","wt")) == NULL)
{
ShowMessage("Файл не вдається сворити");
return;
}
double m1, del,j,y,ys;
int i;
m1=y1/x1;
Y[0]=y1;
Y[1]=y2;
Y[2]=m1;
Y[3]=m2;
Matrix[0][0]=1; Matrix[0][1]=pow(x1,2); Matrix[0][2]=pow(x1,4);
Matrix[0][3]=pow(x1,6);
Matrix[1][0]=1; Matrix[1][1]=pow(x2,2); Matrix[1][2]=pow(x2,4);
Matrix[1][3]=pow(x2,6);
Matrix[2][0]=0; Matrix[2][1]=2*x1; Matrix[2][2]=4*pow(x1,3);
Matrix[2][3]=6*pow(x1,5);
Matrix[3][0]=0; Matrix[3][1]=2*x2; Matrix[3][2]=4*pow(x2,3);
Matrix[3][3]=6*pow(x2,5);
gaus();
Edit6->Text=FloatToStr(a[0]);
Edit7->Text=FloatToStr(a[1]);
Edit8->Text=FloatToStr(a[2]);
Edit12->Text=FloatToStr(a[3]);
j=start;
while(j<=finish)
{
if(j<=x1)
{y=m1*j; fprintf(F,"%lf %lf %lf \n",j,y,m1);}
if((j<x2)&&(j>x1))
{
y=a[0]+a[1]*pow(j,2)+a[2]*pow(j,4)+a[3]*pow(j,6);
ys=2*a[1]*j+4*a[2]*pow(j,3)+6*a[3]*pow(j,5);
fprintf(F,"%lf %lf %lf \n",j,y,ys);
}
if(j>x2)
{y=m2*j+y2-m2*x2; fprintf(F,"%lf %lf %lf \n",j,y,m2);}
j+=h;
}
fclose(F);
}
Результат програми
Текстовий файл
ψ i(ψ) di/dψ
0.000000 0.000000 3.000000
0.100000 0.300000 3.000000
0.200000 0.600000 3.000000
0.300000 0.900000 3.000000
0.400000 1.200000 3.000000
0.500000 1.500000 3.000000
0.600000 1.800000 3.000000
0.700000 2.100000 3.000000
0.800000 2.400000 3.000000
0.900000 2.700000 3.000000
1.000000 3.000000 3.000000
1.100000 3.300000 3.000000
1.200000 3.600000 3.000000
1.300000 3.900000 3.000000
1.400000 4.200000 3.000000
1.500000 4.500000 3.000000
1.600000 4.800000 3.000000
1.700000 5.100000 3.000000
1.800000 5.408315 3.166021
1.900000 5.733145 3.330273
2.000000 6.074308 3.492664
2.100000 6.431613 3.653103
2.200000 6.804860 3.811500
2.300000 7.193842 3.967766
2.400000 7.598340 4.121814
2.500000 8.018128 4.273556
2.600000 8.452971 4.422909
2.700000 8.902627 4.569788
2.800000 9.366844 4.714111
2.900000 9.845361 4.855796
3.000000 10.337912 4.994764
3.100000 10.844221 5.130938
3.200000 11.364004 5.264240
3.300000 11.896971 5.394596
3.400000 12.442823 5.521934
3.500000 13.001254 5.646181
3.600000 13.571954 5.767268
3.700000 14.154601 5.885128
3.800000 14.748869 5.999695
3.900000 15.354428 6.110906
4.000000 15.970937 6.218698
4.100000 16.598051 6.323012
4.200000 17.235421 6.423790
4.300000 17.882690 6.520978
4.400000 18.539495 6.614522
4.500000 19.205471 6.704372
4.600000 19.880245 6.790478
4.700000 20.563440 6.872796
4.800000 21.254676 6.951281
4.900000 21.953567 7.025892
5.000000 22.659724 7.096591
5.100000 23.372754 7.163342
5.200000 24.092260 7.226111
5.300000 24.817842 7.284869
5.400000 25.549099 7.339587
5.500000 26.285624 7.390241
5.600000 27.027011 7.436808
5.700000 27.772849 7.479269
5.800000 28.522727 7.517608
5.900000 29.276233 7.551813
6.000000 30.032952 7.581872
6.100000 30.792469 7.607779
6.200000 31.554369 7.629530
6.300000 32.318236 7.647126
6.400000 33.083656 7.660568
6.500000 33.850212 7.669863
6.600000 34.617490 7.675021
6.700000 35.385078 7.676054
6.800000 36.152564 7.672980
6.900000 36.919538 7.665818
7.000000 37.685592 7.654592
7.100000 38.450322 7.639330
7.200000 39.213325 7.620063
7.300000 39.974202 7.596826
7.400000 40.732559 7.569657
7.500000 41.488004 7.538600
7.600000 42.240151 7.503700
7.700000 42.988618 7.465010
7.800000 43.733028 7.422582
7.900000 44.473012 7.376476
8.000000 45.208203 7.326755
8.100000 45.938244 7.273487
8.200000 46.662785 7.216742
8.300000 47.381479 7.156595
8.400000 48.093993 7.093129
8.500000 48.799997 7.026425
8.600000 49.499173 6.956575
8.700000 50.191210 6.883670
8.800000 50.875809 6.807810
8.900000 51.552677 6.729097
9.000000 52.221536 6.647638
9.100000 52.882117 6.563546
9.200000 53.534162 6.476936
9.300000 54.177425 6.387932
9.400000 54.811673 6.296660
9.500000 55.436685 6.203251
9.600000 56.052256 6.107842
9.700000 56.658192 6.010575
9.800000 57.254314 5.911596
9.900000 57.840459 5.811058
10.000000 58.416479 5.709117
10.100000 58.982241 5.605937
10.200000 59.537631 5.501684
10.300000 60.082548 5.396532
10.400000 60.616913 5.290660
10.500000 61.140662 5.184251
10.600000 61.653752 5.077496
10.700000 62.156156 4.970589
10.800000 62.647871 4.863731
10.900000 63.128911 4.757130
11.000000 63.599313 4.650996
11.100000 64.059133 4.545548
11.200000 64.508453 4.441011
11.300000 64.947373 4.337613
11.400000 65.376021 4.235592
11.500000 65.794546 4.135188
11.600000 66.203121 4.036649
11.700000 66.601946 3.940230
11.800000 66.991246 3.846191
11.900000 67.371273 3.754799
12.000000 67.742303 3.666325
12.100000 68.104644 3.581049
12.200000 68.458629 3.499257
12.300000 68.804621 3.421241
12.400000 69.143013 3.347298
12.500000 69.474227 3.277733
12.600000 69.798716 3.212860
12.700000 70.116966 3.152994
12.800000 70.429493 3.098462
12.900000 70.736847 3.049595
13.000000 71.039612 3.006732
13.100000 71.338405 2.970218
13.200000 71.633879 2.940405
13.300000 71.926721 2.917652
13.400000 72.217657 2.902326
13.500000 72.507447 2.894800
13.600000 72.796890 2.895455
13.700000 73.086823 2.904679
13.800000 73.378124 2.922865
13.900000 73.671708 2.950417
14.000000 73.968533 2.987744
14.100000 74.269597 3.035263
14.200000 74.575940 3.093399
14.300000 74.888645 3.162583
14.400000 75.208839 3.243255
14.500000 75.537694 3.335862
14.600000 75.876425 3.440859
14.700000 76.226294 3.558708
14.800000 76.588610 3.689880
14.900000 76.964730 3.834853
15.000000 77.356057 3.994112
15.100000 77.764045 4.168153
15.200000 78.190197 4.357475
15.300000 78.636067 4.562591
15.400000 79.103259 4.784017
15.500000 79.593431 5.022279
15.600000 80.108294 5.277913
15.700000 80.649611 5.551461
15.800000 81.219202 5.843474
15.900000 81.818940 6.154510
16.000000 82.450757 6.485139
16.100000 83.116640 6.835936
16.200000 83.818636 7.207485
16.300000 84.558848 7.600380
16.400000 85.339443 8.015224
16.500000 86.162645 8.452626
16.600000 87.030741 8.913206
16.700000 87.946080 9.397592
16.800000 88.911074 9.906421
16.900000 89.928200 10.440339
17.000000 91.000000 11.000000
17.100000 92.100000 11.000000
17.200000 93.200000 11.000000
17.300000 94.300000 11.000000
17.400000 95.400000 11.000000
17.500000 96.500000 11.000000
17.600000 97.600000 11.000000
17.700000 98.700000 11.000000
17.800000 99.800000 11.000000
17.900000 100.900000 11.000000
18.000000 102.000000 11.000000
18.100000 103.100000 11.000000
18.200000 104.200000 11.000000
18.300000 105.300000 11.000000
18.400000 106.400000 11.000000
18.500000 107.500000 11.000000
18.600000 108.600000 11.000000
18.700000 109.700000 11.000000
Графік
Висновок: в данній лабораторній роботі я написав мовою С++ програму, що реалізує методи наближення нелінійних характеристик елементів систем керування поліноміальними функціями, навчитися записувати програми у вигляді універсальних процедур для апроксимації нелінійних характеристик.