- •Лабораторна робота №1 Розв’язання нелінійних та трансцендентних рівнянь.
- •1.1 Теоретичні положення.
- •1.2 Числові методи розв’язання нелінійних рівнянь.
- •1.2.1 Метод половинного ділення
- •Лабораторна робота №2 Метод пропорційних частин (хорд)
- •Лабораторна робота №4 Метод простих ітерацій
- •Індивідуальні завдання
- •Лабораторна робота № 5 чисельне інтегрування
- •5.1 Теоретичні положення
- •5.1.1 Формула прямокутників
- •5.1.2 Формула трапецій
- •5.1.3 Формула парабол (Сімпсона)
- •5.2 Індивідуальні завдання до лабораторної роботи №5
- •Лабораторна робота № 6 точність чисельного інтегрування
- •6.1 Теоретичні положення
- •6.2 Індивідуальні завдання до лабораторної роботи №6
- •Перша інтерполяційна формула Ньютона має вигляд
- •Індивідуальні завдання
- •Метод прогону.
- •Проекційні методи (на прикладі методу Гальоркіна).
- •Обчислювальні схеми Метод прогону.
- •Проекційні методи (на прикладі методу Гальоркіна).
- •Додаток Тексти програм
- •Метод прогону.
- •Метод Гальоркіна.
- •Список літератури Основна.
- •Додаткова
Метод Гальоркіна.
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