МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ЛАБОРАТОРНА РОБОТА № 1
з курсу “ Моделювання процесів та елементів систем керування ”
ПОЛІНОМІАЛЬНА АПРОКСИМАЦІЯ НЕЛІНІЙНИХ ХАРАКТЕРИСТИК ЕЛЕМЕНТІВ
Львів – 2017
1. Мета роботи.
Вивчити методи наближення нелінійних характеристик елементів систем керування поліноміальними функціями, а саме: поліномами Лагранжа, Тейлора та кубічними сплайнами; навчитися записувати програми у вигляді універсальних процедур для апроксимації нелінійних характеристик.
2. Завдання.
Завдання для лабораторної роботи дають із зазначенням номера апроксимуючої функції та варіанта чисельних значень координат вузлів апроксимації. В даній роботі необхідно виконати апроксимацію кривої намаґнечування. Крива намаґнечування задається двома точками, що відділяють лінійні зони від нелінійної (рис. 1). Координати цих точок позначені А(і1, 1), В(і2, 2). Для того, щоб виконати апроксимацію ділянки АВ поліномом, необхідні ще значення похідних в точках А, В. Для першої точки (А) похідна визначається безпосередньо за значеннями функції і аргументу у вузлі
m1 = i1/1, (18)
а для другої точки (В) похідна m2 задана. Тоді рівняння лінійної ділянки ОА визначається рівнянням прямої, що проходить через початок координат
i() = m1 (19)
Рівняння ділянки ВС описує зону насичення феромаґнетного осердя яку також можна вважати лінійною, тому
i() = m2 + i0, (20)
де вільний член і0 визначаємо за формулою
i0 = i2 - m22 . (21)
Таким чином, криву намаґнечування апроксимуємо виразом з вибором розрахункової формули, в якій є два рівняння прямої і одна нелінійна функція
(22)
3. Остаточна версія програми.
#include <math.h>
#include <vcl.h>
#pragma hdrstop
#include <fstream.h>
#include <iostream.h>
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
using namespace std;
//Для розв'язку поставленої залачі, необхідно знайти коефіцієнти
//апроксимаційного полінома a0 + a1*fi + a2*pow(fi,2) + a3*pow(fi,3).
//Використаємо метод вибраних точок.
//Для цього необхідно мати систему із чотирьох рівнянь.
//Для її побудови використаємо значення функції, які задані в точках
//fi1 та fi2, а також похідні функції у цих точках.
//Початок. Загальний вигляд функції------------------------------------------
//i(fi) = a0 + a1*fi + a2*pow(fi,2) + a3*pow(fi,3).
//Кінець. Загальний вигляд функції-------------------------------------------
//Початок. Загальний вигляд системи рівнянь----------------------------------
//a0 + a1*fi1 + a2*pow(fi1,2) + a3*pow(fi1,3) = i1.
//a0 + a1*fi2 + a2*pow(fi2,2) + a3*pow(fi2,3) = i2.
//0 + a1 + 2*a2*fi1 + 3*a3*pow(fi1,2) = m1.
//0 + a1 + 2*a2*fi2 + 3*a3*pow(fi2,2) = m2.
//Кінець. Загальний вигляд функції-------------------------------------------
//Початок. Матриця коефіцієнтів----------------------------------------------
//a0--a1----a2--------------a3--------------------------------------------------
//1 + fi1 + pow(fi1,2) + pow(fi1,3) = i1.
//1 + fi2 + pow(fi2,2) + pow(fi2,3) = i2.
//0 + 1 + 2*fi1 + 3*pow(fi1,2) = m1.
//0 + 1 + 2*fi2 + 3*pow(fi2,2) = m2.
//Кінець. Матриця коефіцієнтів-----------------------------------------------
//Кінець. Загальний вигляд функції-------------------------------------------
//Початок. Параметри системи-------------------------------------------------
i1 = 0.8;
i2 = 15;
fi1 = 0.4;
fi2 = 1.2;
m1 = i1/fi1;
m2 = 40;
i0 = i2 - m2*fi2;
//Число кроків табулювання---------------------------------------------------
N = 1000;
//Крок табулювання-----------------------------------------------------------
h = (1.1*fi2)/N;
//Матриця коефіцієнтів-------------------------------------------------------
A[1][1] = 1;
A[1][2] = fi1;
A[1][3] = pow(fi1,2);
A[1][4] = pow(fi1,3);
A[2][1] = 1;
A[2][2] = fi2;
A[2][3] = pow(fi2,2);
A[2][4] = pow(fi2,3);
A[3][1] = 0;
A[3][2] = 1;
A[3][3] = 2*fi1;
A[3][4] = 3*pow(fi1,2);
A[4][1] = 0;
A[4][2] = 1;
A[4][3] = 2*fi2;
A[4][4] = 3*pow(fi2,2);
//Стовпець вільних членів----------------------------------------------------
B[1] = i1;
B[2] = i2;
B[3] = m1;
B[4] = m2;
//Кінець. Параметри системи--------------------------------------------------
//Початок. Створюємо та відкриваємо файл для запису даних--------------------
FILE *pFile;
pFile = fopen("Lab_1_i_a_fi.dat","w+");
//Кінець. Створюємо та відкриваємо файл для запису даних---------------------
//Початок. Метод Гаусса з вибором елемента по стовпцю------------------------
//Розмірність матриці елементів----------------------------------------------
n = 4;
//Початок. Прямий хід--------------------------------------------------------
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
V[i][j] = A[i][j];
P[i] = B[i];
}
for(k=1;k<=n;k++)
{
//Початок. Стовпцеві сортування----------------------------------------------
max = fabs(V[k][k]);
w = k;
for(l=k+1;l<=n;l++)
{
if(max < fabs(V[l][k]))
{
max = fabs(V[l][k]);
w = l;
}
}
value = P[k];
P[k] = P[w];
P[w] = value;
for(d=1;d<=n;d++)
{
value = V[k][d];
V[k][d] = V[w][d];
V[w][d] = value;
}
//Кінець. Стовпцеві сортування----------------------------------------------
Y[k] = P[k]/V[k][k];
for(i=k+1;i<=n;i++)
{
P[i] = P[i] - V[i][k]*Y[k];
for(j=k+1;j<=n;j++)
{
C[k][j] = V[k][j]/V[k][k];
V[i][j] = V[i][j] - V[i][k]*C[k][j];
}
}
}
//Кінець. Прямий хід--------------------------------------------------------
//Початок. Обернений хід----------------------------------------------------
X[n] = Y[n];
temp = 0;
for(i=n-1;i>=1;i--)
{
for(j=i+1;j<=n;j++)
{
temp = temp + C[i][j]*X[j];
}
X[i] = Y[i] - temp;
temp = 0;
}
//Кінець. Обернений хід-----------------------------------------------------
//Визначення коефіцієнтів поліному------------------------------------------
a0 = X[1];
a1 = X[2];
a2 = X[3];
a3 = X[4];
//Початок. Табулювання функції----------------------------------------------
for(fi=0;fi<=1.1*fi2;fi=fi+h)
{
//Крива намаґнечування та її похідна----------------------------------------
if(fi<=fi1)
{
func_i = m1*fi;
func_a = m1;
}
if((fi>fi1)&&(fi<=fi2))
{
func_i = a0 + a1*fi + a2*pow(fi,2) + a3*pow(fi,3);
func_a = a1 + 2*a2*fi + 3*a3*pow(fi,2);
}
if(fi>fi2)
{
func_i = m2*fi + i0;
func_a = m2;
}
//Початок.Записуємо дані у файл----------------------------------------------
fprintf(pFile,"%-10.10f %-10.10f %-10.10f\n",func_i,func_a,fi);
//Кінець.Записуємо дані у файл-----------------------------------------------
//Початок. Будуємо графіки АФХ, АЧХ, ФЧХ-------------------------------------
Series1->AddXY(fi,func_i,"",clRed);
Series2->AddXY(fi,func_a,"",clRed);
//Кінець. Будуємо графіки АФХ, АЧХ, ФЧХ--------------------------------------
}
//Кінець. Табулювання функції-----------------------------------------------
fprintf(pFile,"%-10.10f %-10.10f %-10.10f %-10.10f\n",a0,a1,a2,a3);
//Початок.Закриваємо файл----------------------------------------------------
fclose(pFile);
//Кінець.Закриваємо файл-----------------------------------------------------
}
4. Результати роботи програми.
Графіки апроксимованої кривої намаґнечування та її похідної
5. Висновки.
На даній лабораторній роботі ми вивчали методи наближення нелінійних характеристик елементів систем керування поліноміальними функціями, а саме: поліномами Лагранжа, Тейлора та кубічними сплайнами.
Для розв’язання поставленої задачі був використаний метод вибраних точок. Система рівнянь із чотирьох невідомих була складена за відомими значеннями функції в двох точках та похідними функції у цих точках.
Оскільки матриця коефіцієнтів містила нульові члени, для пошуку коренів був використаний метод Гауса з вибором елемента по стовпцю.
Результати роботи програми збережені у файлі.
Графіки апроксимованої кривої намаґнечування та її похідної побудовані за допомогою програми GRAPHER.