з часом буде зменшуватися i в певний момент ча---су tвст вона стане настiльки малою, що нею можна знехтувати. Та---ким моментом слiд вважати той, коли максимальне вiдхилення амплi---туди коливань не буде перевищувати 5% вiд нового встановленого стану, тобто 0.05 (5% вiд 1 = 0.05). Рекомендоване значення tвст для даного варiанту подано в таблицi 1.
Отже, дифpiвняння pозв'язуємо на вiдтинку часу 0 <= t <= tвст, а обмеженням для задачі оптимiзацiї є 0 <= C0 < C0k.
3. Алгоритм головної програми
В головний алгоритм включені такi дiї:
присвоєння всiм константам їхніх значень;
обчислення C0k;
звернення до пiдпрограми розв'зку диференцiальних рiвнянь, одержання масиву значень величини y при C0=C0k;
друкування масиву y пpи C0=C0k;
звернення до пiдпрограми побудови графiка функцiї y=f(t) – розв’язку заданого дифрівняння при C0=C0k;
звернення до пiдпрограми оптимiзацiї, обчислення C0о – оптимального значення C0;
звернення до пiдпрограми розв'язку диференцiальних рiвнянь, одержання масиву значень величини y при C0=C0o;
роздрук масиву y пpи C0=C0o;
звернення до пiдпрограми побудови графiка функцiї y=f(t) при C0=C0o.
Текст головної програми лінійного типу разом з пiдпpогpамами пpиведено в додатку А. Таблиця ідентифікаторів програми приведена в додатку Б. Графіки рішення задачі для коливного та оптимального процесів подані в додатку В.
4. Перетворення дифрівняння в систему дифрiвнянь
Для перетворення заданого дифрiвняння в систему рiвнянь першого по---рядку застосуємо таку пiдстановку:
y=x3;
y'=x3'=x2;
y''=x3''=x2'=x1.
Система дифрiвнянь прийме вигляд
x1'=(b0-a0*x3-a1*x2-a2*x1)/a3;
x2'=x1;
x3'=x2.
Початковi умови: x1=x2=x3=0 при t=0. Вихiдна величина y=x3.
5. Алгоритм оптимізації функції
Постановка задачі має вигляд iнтегра---льного критерiя
де t0 - момент початку коливного процесу, секунд (t0=0);
tвст - момент закiнчення коливного процесу, секунд,
при обмеженнях на управляючу змінну
0 <= C0 < C0k,
де С0 – коефіцієнт дифрівняння;
С0k – коливна межа стійкості.
Суть покрокового методу полягає в тому, що відрізок [C0 , C0k] ділять на n частин та одержують значення C00, C01, C02, ..., C0n. Потім обчислюють всі значення функції U(С0і) і вибирають найменше шляхом їх порівняння між собою. Алгоритм методу представляє собою цикл з розгалуженням всередині циклу.
6. Алгоритм розв’язування системи дифрівнянь
Постановка задачі розв’язування рівняння має вигляд задачі Коші
y ' = f(t,y), y = 0 при t=0.
При використанні методу Рунге-Кута в циклі обчислюють коефіцієнти
ai=h*f(ti, yi);
bi=h*f(ti+h/2, yi+a/2);
ci=h*f(ti+h/2, yi+b/2);
di=h*f(ti+h, yi+c);
Тоді формула Рунге-Кута має вигляд
yi+1=yi+ (ai+2*bi+2*ci+di)/6.
Тут i = 1,n;
n – кількість елементарних відрізків діапазону [0 <= t <= tвст] (n=100);
h – крок інтегрування дифрівняння (h = tвст/n);
t0 = 0, ti+1 = ti+h.
Алгоритм методу представляє собою один цикл з параметром i = 1,n. В циклі накопичується сума за формулою Рунге-Кута.
7. Алгоритм обчислення означеного інтегралу
Постановка задачі інтегрування функції має вигляд
За методом Сімпсона використовується формула
I = [y(t0) + 4y(t1) + 2y(t2) +4y(t3) + ... + 4y(tn-1)+ y(tn)]*h/3,
де t0=0, tn= tвст, n – кількість елементарних відрізків (n=100).
Алгоритм методу Сімпсона являє собою цикл з накопиченням суми.
Перелiк використаних лiтературних джерел
Данилина Н.И. и др. Вычислительная математика. - М.: Высшая школа, 1985
Калиткин Н.Н. Численные методы. - М.: Наука, 1976.
Бахвалов Н.С., Жидков Н.П., Кобельков Г.М. Численные методы. - М.: Наука, 1987
Гаврилюк І.П., Макаров В.Л. Методи обчислень. — К.:Вища школа, 1995 — т.1,2
Ляшенко М.Я., Головань М.С. Чисельні методи. — К.: Либідь, 1996
Турчак Л.І. Основы численных методов. — М.: Наука, 1987
Бочков С.О., Субботин Д.М. Язык программирования Си для персо---нального компютера. - М.: Радио и связь, 1990
Трой Д. Программирование на языке Си для персонального компютера IBM PC. - М.: Радио и связь, 1991
Методичні вказівки до виконання курсової роботи. ІФНТУНГ, Факел. –Івано-Франківськ, 2003
Лабораторний практикум з програмування мовою Сі для студентів спеціальності 7.091401 – АУ. ІФНТУНГ, ДОП. –Івано-Франківськ, 1996
Додаток А. Текст програми
# include <stdio.h>
# include <bios.h>
# include <graphics.h>
float x4[101],y[4],z[4],f[4],a[4],b[4],c[4],d[4];
float k1=3,k2=5,a0,a1,a2,a3,b0,b1,h,min,in,c0k,c0o,c0;
float c1=0.2,twst=0.5,t1=0.1,t2=0.01,t3=0.2;
int i,j,m=3,n=100;
/*Grafik*/
grafik(char *c)
{int col=EGA_WHITE;
int j,i,gmode,gdriver=DETECT;
initgraph(&gdriver,&gmode,"\BGI");
fprintf(stdout,"\nGrafik %s procesu\n",c);
for(i=0;i<100;i++)line(4*i+100,300-100*x4[i],4*(i+1)+100,300-100*x4[i+1]);
line(100,200,500,200);
line(100,300,500,300);line(100,100,100,500);
outtextxy(80,200,"1");outtextxy(80,300,"0");
bioskey(0);
closegraph();return;
}
/* Метод Рунге-Кутта */
void RunKut(float c0)
{void systema(void);
y[1]=y[2]=y[3]=0; b0=c0*k1*k2;a0=1+b0;x4[0]=0;
for(i=1;i<=n;i++)
{ for(j=1;j<=m;j++)z[j]=y[j];
systema();
for(j=1;j<=m;j++){a[j]=f[j]*h;y[j]=z[j]+a[j]/2;}
systema();
for(j=1;j<=m;j++){b[j]=f[j]*h;y[j]=z[j]+b[j]/2;}
systema();
for(j=1;j<=m;j++){c[j]=f[j]*h;y[j]=z[j]+c[j];}
systema();
for(j=1;j<=m;j++){d[j]=f[j]*h;
y[j]=z[j]+(a[j]+2*(b[j]+c[j])+d[j])/6;}
x4[i]=b0*y[3]+b1*y[2];}
return;}
/* Система дифрiвнянь */
void systema(void)
{f[1]=(1-a0*y[3]-a1*y[2]-a2*y[1])/a3;
f[2]=y[1];
f[3]=y[2];
return;}
/* Метод покроковий */
void Krok(void)
{float Simpson(void);int l=30,p;
c0=0;min=Simpson();
for(p=1;p<=l;p++)
{c0=c0k*p/30;
in=Simpson();
if(in<min){min=in;c0o=c0;}}
return;}
/* Метод Сiмпсона */
float Simpson(void)
{RunKut(c0);
in=(1-x4[0])*(1-x4[0])+(1-x4[n])*(1-x4[n])+(1-x4[n-1])*(1-x4[n-1]);
for(i=1;i<=n-3;i++,i++)
in+=4*(1-x4[i])*(1-x4[i])+2*(1-x4[i+1])*(1-x4[i+1]);
return(in*h/3);}
/* Головна програма */
main()
{char mas[15],*c=mas;
void RunKut(float);h=twst/n;
b1=c1*k1*k2;a1=b1+t1+t3;a2=t2+t1*t3;a3=t1*t2;
c0k=a1*a2/(k1*k2*a3)-1/(k1*k2);
fprintf(stdout,"\n Курсова робота\n\n");
fprintf(stdout,"Результати розрахункiв:\n");
fprintf(stdout,"Коливне c0=%f\n\n",c0k);bioskey(0);
RunKut(c0k);
fprintf(stdout,"\nКоливний перехiдний процес,");
fprintf(stdout," масив значень вихiдної величини\n\n");
for(i=1;i<=n;i+=5)
fprintf(stdout,"%f\t%f\t%f\t%f\t%f\n",
x4[i],x4[i+1],x4[i+2],x4[i+3],x4[i+4]);
c="коливного";
grafik(c);
Krok();
fprintf(stdout,"Оптимальне c0=%f\n",c0o);bioskey(0);
fprintf(stdout,"\nОптимальний перехiдний процес,");
fprintf(stdout," масив значень вихiдної величини\n\n");
RunKut(c0o);
for(i=1;i<=n;i+=5)
fprintf(stdout,"%f\t%f\t%f\t%f\t%f\n",
x4[i],x4[i+1],x4[i+2],x4[i+3],x4[i+4]);
c="оптимального";
grafik(c);
}
Додаток Б. Таблиця ідентифікаторів
Ім’я
змінної | Ідентифікатор у програмі |
Значення
y | x4[101] | Масив значень величини у (для графіка)
y[4] | Масив правих частин системи дифрівнянь
z[4] | Допоміжний масив правих частин системи
f[4] | Масив правих частин системи дифрівнянь
k1 | k1 | =3 – заданий коефіцієнт дифрівняння
k2 | k2 | =5 – заданий коефіцієнт дифрівняння
а0 | a0 | = 1+b0
а1 | a1 | =b1+T1T3
а2 | a2 | =T2+T1T3
а3 | a3 | =T1T2
b0 | b0 | =C0k1k2
b1 | b1 | =C1k1k2
h | h | H=tвст/n – крок інтегрування
min | Мінімальне значення інтегралу функці
in | Значення інтегралу функції y=f(t)
Cок | c0k | Коливна межа стійкості рішення
Сопт | c0o | Оптимальне значення C0
С0 | c0 | Коефіцієнт дифрівняння
С1 | c1= | =0.2 – заданий коефіцієнт дифрівняння
tвст | twst=0.5 | =0.5 час припинення коливань системи
Т1 | t1= | =0.1 – заданий коефіцієнт дифрівняння
Т2 | t2= | =0.01 – заданий коефіцієнт дифрівняння
Т3 | t3= | =0.2 – заданий коефіцієнт дифрівняння
i,j | Цілі змінні, параметри циклів
m | =3 – кількість дифрівнянь системи
n | =100 – число відрізків