Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичні матеріали для забезпечення лабораторн...doc
Скачиваний:
3
Добавлен:
12.11.2019
Размер:
673.28 Кб
Скачать
  1. Метод Гальоркіна.

Uses Crt; {підключення модуля Crt}

Var

m:byte{степінь полінома};

і,j,k: byte;{службові}

o:char;{відповідь користувача}

flag : boolean;{службова}

a, al0, al1, aa, b, b0, b1, bb,alf,bet:real;{крайові умови}

d,a1,a2,e,e1,e2,e3:real;{службові}

c: array [1..10,1..10] of real;{коефіцієнти матриці m*m}

dd,x: array[1..10] of real;{праві частини і шуканий вектор}

r: array [1..4] of real;{допоміжний вектор}

g: array [1..5] of real;{допоміжний вектор}

{***************************************************************}

procedure rab;forward;

procedure matrix;forward;

procedure poisk;forward;

procedure iskl;forward; {передопис процедур}

procedure vyvod;forward;

{***************************************************************}

procedure matrix;{основна процедура перетворень матриці C}

var q : real;

begin

i:=1;

repeat

if c[i,i]=0 then poisk;

k:=i+1;

repeat

iskl;

k:=k+1;

until k>m;

inc(i);

until i>m-1;

x[m]:=dd[m]/c[m,m]; {визначення m-ого кореня}

і:=і-1;

repeat {цикл підрахунку всіх інших коренів}

q:=0;

for k:=i+1 to m do

q:=q+c[i,k]*x[k];

x[i]:=(dd[i]-q)/c[i,i];

dec(i);

until i<1;

end;

{***************************************************************}

procedure poisk;{процедура пошуку ненульового ведучого елемента}

var h:byte;

buf : real;

begin

for j:=i+1 to m do

if c[j,i]<>0 then

begin

for h:=1 to m do

begin

buf:=c[i,h];

c[і,h]:=c[j,h]; {заміна рядків}

c[j,h]:=buf;

end;

exit;

end;

end;

{**********************************************************}

procedure iskl;{процедура виключення елемента C<k,і>}

var r,mm: real;{допоміжні}

begin

r:=-(c[k,i]/c[i,i]);

for j:=1 to m do

begin

mm:=r*c[i,j];

c[k,j]:=c[k,j]+mm;

end;

dd[k]:=dd[k]+r*dd[i];

end;

{**********************************************************}

function px(x:real) : real;{функція р(х)}

begin

px:=x*x-1;

end;

{**********************************************************}

function qx(x:real) : real;{функція q(х)}

begin

qx:=x*x;

end;

{**********************************************************}

function fx(x:real) : real;{функція f(х)}

begin

fx:=x+1;

end;

{**********************************************************}

procedure vvod;{процедура введення}

begin

clrscr;

textcolor(7);

Write('УВЕДІТЬ СТЕПІНЬ ПОЛІНОМА ');

ReadLn(m);

writeln('УВЕДІТЬ КОЕФІЦІЄНТИ КРАЙОВИХ УМОВ ');

write('a, al0, al1, aa, b, b0, b1, bb ');

readln(a, al0, al1, aa, b, b0, b1, bb);

rab;

end;

{************************************************************}

procedure shap;{процедура виводу шапки}

begin

repeat {основний цикл діалогу з користувачем}

ClrScr;

textcolor(15);

writeln('СПЕЦ РОЗДІЛИ МАТЕМАТИКИ');

writeln('ЛАБОРАТОРНА РОБОТА ');

writeln('(с) AJ 7.05.2001');

writeln('МЕТОД ГАЛЬОРКІНА (розв’язку КРАЙОВОЇ ЗАДАЧІ)');

writeln;

writeln('ЗРОБІТЬ ВИБІР');

writeln('p - ПРОДОВЖИТИ');

writeln('Esc - ВИХІД');

o:=readkey; {відповідь користувача}

o:=upcase(o);

case o of

'P' :begin

vvod;{уведення даних}

end;

#27: halt {вихід із програми}

else Continue;

end;

until flag;

end;

{**********************************************************}

function sum1(x:real):real;{підрахунок проміжної суми}

var i:byte;

buf : real;

begin

buf:=0;

for i:=1 to 5 do

buf:=buf + g[i]*exp((i-1)*ln(abs(x)));

sum1:=buf;

end;

{**********************************************************}

function sum2(x:real):real;{підрахунок проміжної суми}

var i:byte;

buf : real;

begin

buf:=0;

for i:=1 to 4 do

buf:=buf + r[i]*exp((i-1)*ln(abs(x)));

sum2:=buf;

end;

{**********************************************************}

FUNCTION step (x:real;n:integer):real;{піднесення до степеня}

begin

IF n = 0 THEN

step := 1

ELSE

step := step(x,n - 1) * x;

end;

{**********************************************************}

{процедура обчислення інтеграла}

procedure integ(a,b : real; var s : real;func : byte; o,p: byte; dd: real);

var ss,w,x,d,ch1,ch2 : real;

n,k,i : integer;

begin

ss := 0;

n := 10;

for k:= 1 to 20 do {цикл - обмеження кількості повторень}

begin

n:=2*n;

d := (b-a)/n; {приріст}

s:=0;

x:=a;

for і:=0 to n-1 do {обчислення інтегральної суми}

begin

case func of

1 :

begin

ch1:=(px(x)*(e1+e2*x+e3*x*x)+qx(x)*sum1(x))*step((x-a1),(o+p-2)) ;

ch2:=(px(x+d)*(e1+e2*(x+d)+e3*(x+d)*(x+d))+qx(x+d)*sum1(x+d))*step((x+d-a1),(o+p-2)) ;;

s:=s+ (ch1+ch2)*d;

end;

2 :

begin

ch1:=(px(x)*p*bet*(x-a2)+qx(x)*sum2(x)+fx(x)*(sqr(x)-dd*x-e))*step((x-a1),(p-1));

ch2:=(px(x+d)*p*bet*(x+d-a2)+qx(x+d)*sum2(x+d)+fx(x+d)*(sqr(x+d)-dd*(x+d)-e))*step((x-a1+d),(p-1));

s:=s+(ch1+ch2)*d; {вибір функції}

end;

end;

x:=x+d;

end;

s:=0.5*s;

w:=s-ss;

if abs(w)<e then break else ss:=s; {умова кінця обчислень}

end;

end;

{**********************************************************}

procedure rab;{основна процедура обчислень}

var buf: real ;

begin

bet:=(b0*aa-al0*bb)/(al0*b0*(a-b)+b0*al1-al0*b1);

alf:=aa-a*bet;

d:=(b*b-a*a+2*(b*b1-a*al1))/(b-a+al1-b1);

e:=a*(2*a1+a)+d*(a1-a);

a1:=1/2*(d-sqrt(d*d+4*e));

a2:=0.5*(d+sqrt(d*d+4*e));

r[1]:=alf*a1*a1;

r[2]:=a1*(bet*a1-2*alf);

r[3]:=-a1*bet;

r[4]:=1;

g[1]:=e*e;

g[2]:=2*d*e;

g[3]:=d*d-2*e;

g[4]:=-2*d;

g[5]:=1;

for k:=1 to m do

for i:=1 to m do

begin

e1:=(k*a2+a1)*(i*a2+a1);

e2:=-a1*(2+k+і)-a2*(2*k*і+k+і);

e3:=(k+1)*(і+1);

integ(a,b,buf,1,k,і,d); {цикл наповнення С}

c[k,i]:=-buf;

integ(a,b,dd[i],2,k,i,d);

end;

matrix;{перехід на визначення коренів ai}

vyvod;{перехід на вивід }

end;

{***************************************************************}

procedure vyvod;{ вивід результату}

begin

clrscr;

textcolor(10);

writeln('РЕЗУЛЬТАТ (вектор А коефіцієнтів)');

textcolor(12);

for i:=1 to m do

begin

writeln(x[i]:6:2);

end;

readln;

shap;

end;

{**********************************************************}

BEGIN

flag := false;

shap;{виклик процедури виводу шапки}

END.

Результати роботи

Вхідні дані:

p(x)=x2-1; q(x)=x2; f(x)=x+1;

a=-1, 0=3, 1=0, A=1;

b=1, 0=2, 1=0, B=4;

m=5.

Вихідні дані (вектор коефіцієнтів a): 36,02 –62,72 55,03 –23,98 6,24

Лабораторна робота 8

Методи пошуку максимуму функції двох змінних.

Метод координатного спуска.

Викладемо цей метод на прикладі функції двох змінних F(x,y). Виберемо нульове наближення x0 y0. Фіксуємо значення координати y=y0. Тоді функція буде залежати тільки від однієї змінних х; позначимо її через f1(x)=F(x,y0). Використовуючи один з вище розглянутих методів пошуку максимуму функції однієї змінної знайдемо максимум функції однієї змінної f1(x) і позначимо його через x1. Ми зробили крок із крапки (x0,y0) у крапку (x1,y0) по напрямку, рівнобіжному осі x; на цьому кроці значення функції збільшилося. Потім з нової крапки зробимо спуск по напрямку, рівнобіжному осі y тобто розглянемо f2(x)=F(x1,y), знайдемо її максимум і позначимо його, через y1. Другий крок приводить нас у крапку (x1,y1). Прихід у крапку (x1,y1) завершує цикл спусків. Будемо повторювати цикли. На кожнім спуску функція не убуває, і при цьому значення функції обмежені зверху її значенням у максимумі. Отже, ітерації сходяться до деякої межі F ≤ F max.

Метод спірального координатного спуска.

Даний метод дуже схожий на попередній, але відрізняється тим, що крок h змінюється щораз при переході від пошуку максимуму по одного змінній до пошуку максимуму по інший змінній. У тривимірному просторі це нагадує спуск у западину по спіралі. Звичайно цей метод дає деяке скорочення часу пошуку.

Розробка програмного забезпечення.

Блок-схема порозрядного пошуку.

Початок

X=X0

F(x+h)<F(x)

H=-h/4

|h|<e/4

x=x+h

F(x)

Кінець

Так

Так

Блок-схема методу дихотомії.

Початок

|a-b|<2e

x1 =(a+b-e)/2

x2 =(a+b+e)/2

F(x1)> F(x2)

xm =(a+b)/2

Кінець

Так

Ні

Так

Ні

a=x1

a=x2

Блок-схема методу золотої середини.

Блок-схема координатного спуску.

Блок-схема методу спірального координатного спуску відрізняється від попередніх тим, що крок h змінюється щораз при переході від пошуку максимуму по одного перемінній до пошуку максимуму по інший змінній.

Індивідуальні завдання

Для заданих значень X знайти значення функції, заданої дискретно. Використовувати рекомендовані чисельні методи.

Таблиця 1

Таблиця 2