Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
ЧИСЕЛЬНЕ ДИФЕРЕНЦІЮВАННЯ ФУНКЦІЙ ЗА ДОПОМОГОЮ ІНТЕРПОЛЯЦІЇ КУБІЧНИМ СПЛАЙНОМ
Один з основних підходів чисельного диференціювання полягає в тому, що формули для апроксимації похідних різного порядку точності отримують у результаті диференціювання різних інтерполяційних многочленів.
Дійсно, нехай відомі значення певної функції в точках і треба обчислити . Для цього побудуємо функцію , що інтерполює , і наближено припустимо . Якщо для функції відома похибка (чи її оцінка), то похибка похідної може бути виражена формулою .
Сплайном порядку називають функцію, що є многочленом ступеня окремо на кожному із відрізків , на які розбитий вихідний відрізок , тобто при , і яка, крім того, задовольняє умовам неперервності похідних до порядку в точках :
при
Кубічний сплайн , що задовольняє умові інтерполяції, тобто співпадає з функцією в точках , можна записати у вигляді
, (1)
, .
За умови, що (один із варіантів задання крайових умов), коефіцієнти визначаються із системи рівнянь
, (2)
.
Тут .
За знайденими числами коефіцієнти і визначаються за формулами
, , (3)
.
Приклад. Використовуючи умови прикладу пункту 1.2 побудувати інтерполяційний кубічний сплайн.
Розвязок. Маємо: тобто сітка рівномірна , що трохи спрощує обчислення. Система рівняння (2) набуває вигляду (за умови )
, ,
У розгорнутому вигляді маємо:
Підставляючи в систему вхідні дані та враховуючи, що перетворимо її до вигляду:
Розвязуючи останню систему, знаходимо:
; .
Далі за формулами (3) одержуємо:
; ; ;
; ; ;
; ; .
Таким чином, шуканий сплайн має вигляд
Тоді .
Індивідуальне завдання № 1
За заданою таблицею значень функції побудуйте кубічний сплайн , що задовольняє умовам інтерполяції. Потім з його допомогою приблизно обчисліть значення функції та її похідної другого порядку в заданій точці .
-9,2 |
4,810 |
||
-0,9 |
0,895 |
||
4,0 |
2,011 |
||
-4,8 |
1,108 |
||
6,5 |
2,698 |
||
Розвязання
program interpol_langr;
var i,j,k,l:integer;
xi,fxi,fxii,fi,a,tp:extended;
x:array[0..4] of extended;
fx:array[0..4]of extended;
h,b,d,a2:array[1..4] of extended;
c:array[0..4] of extended;
R:array[0..4,0..5] of extended;
begin
x[0]:=-9.2;
fx[0]:=4.810;
x[1]:=-0.9;
fx[1]:=0.895;
x[2]:=4.0;
fx[2]:=2.011;
x[3]:=-4.8;
fx[3]:=1.108;
x[4]:=6.5;
fx[4]:=2.698;
fxi:=0;
xi:=-6.6;
c[0]:=0 ;
c[4]:=0;
for i:=1 to 4 do
begin
h[i]:=x[i]-x[i-1];
end;
for i:=0 to 2 do
begin
r[i,0+i]:=h[i+1];
r[i,1+i]:=2*(h[i+1]+h[i+2]) ;
r[i,2+i]:=h[i+2];
r[i,5]:=6*(((fx[i+2]-fx[i+1]))/(h[i+2])-((fx[i+1]-fx[i]))/(h[i+1]))
end;
r[3,0]:=1;
r[4,4]:=1;
k:=0;
for i:=0 to 4 do
begin
for j:=0 to 5 do
begin
write(r[i,j]:0:4,' ');
end;
writeln;
end;
for i:=0 to 3 do
begin
for j:=i+1 to 4 do
begin
a:=r[j,k]/r[i,k];
for l:=k to 5 do
begin
r[j,l]:=r[j,l]-a*r[i,l];
end;
end;
k:=k+1;
end;
writeln;
for i:=0 to 4 do
begin
for j:=0 to 5 do
begin
write(r[i,j]:0:4,' ');
end;
writeln;
end;
writeln;
for i:=4 downto 0 do
begin
for j:=i to 4 do
begin
if i<> j then tp:=tp+r[i,j]*c[j];
end;
c[i]:=(r[i,5]-tp)/r[i,i];
end;
for i:=0 to 4 do write(c[i]:0:8,' ');
c[0]:=0 ;
c[4]:=0;
writeln;
for i:=1 to 4 do
begin
d[i]:=(c[i]-c[i-1])/h[i];
b[i]:=(h[i]*c[i]/2)-(h[i]*h[i]*d[i]/6)+((fx[i]-fx[i-1])/h[i]);
a2[i]:=fx[i];
end;
for i:=0 to 4 do
begin
if xi<x[i] then begin j:=i;break; end;
end;
fxi:=a2[j]+b[j]*(xi-x[j])+((xi-x[j])*(xi-x[j])*c[j]/2)+((xi-x[j])*(xi-x[j])*(xi-x[j])*d[j]/6);
fxii:=c[j]+(xi-x[j])*d[j];
writeln('f(',xi,')=',fxi);
writeln('f``(',xi,')=',fxii);
readln;
end.
Відповідь
0.51680109 0.01998754 0.04659564 0.12772152 0.00000000
f(-6.6000000000000000E+0000)= 2,00758 53677073E+0000
f``(-6.6000000000000000E+0000)= 0.21413781326526353E-0003
Завдання № 2
«Метод Рунге-Кутта четвертого порядку точності. Рішення задачі Коші для звичайного диференційованого рівняння»
Теоретичні відомості:
Нехай дано диференціальне рівняння з початковою умовою . Виберемо крок , позначивши і , . Розглянемо числа:
;
;
;
Тоді значення шуканої функції визначається за формулою
,
де ; .
Похибка цього методу величина порядку .
Приклад. Розвяжемо методом Рунге-Кутта задачу Коші: ; ; на інтервалі (0;0,4).
Розвязок. Покажемо початок процесу.
Для обчислюємо послідовно
,
,
,
.
Звідси .
Отже .
Завдання:
Методом Рунге-Кутта розвяжіть задачу Коші.
Номер правої частини |
Інтервал |
|||
-0,3 |
2 |
1 |
0,2 |
[0;2] |
Розвязання:
uses crt;
var
i,n:integer;
k1,k2,k3,k4,h:real;
dq,d2q,dy,q,x,y:array [0..20] of real;
begin
clrscr;
x[0]:=0;
y[0]:=1.05;
h:=0.1;
for i:=1 to 10 do
x[i]:=x[0]+i*h;
for i:=0 to 9 do
begin
k1:=h*ff(x[i],y[i]);
k2:=h*ff(x[i]+h/2,y[i]+k1/2);
k3:=h*ff(x[i]+h/2,y[i]+k2/2);
k4:=h*ff(x[i]+h,y[i]+k3);
y[i+1]:=y[i]+(k1+2*k2+2*k3+k4)/6;
writeln(y[i+1]:10:4);
end;
readln;
q[0]:=h*ff(x[0],y[0]);
q[1]:=h*ff(x[1],y[1]);
q[2]:=h*ff(x[2],y[2]);
q[3]:=h*ff(x[3],y[3]);
dq[0]:=q[1]-q[0];
dq[1]:=q[2]-q[1];
d2q[0]:=dq[1]-dq[0];
for i:=0 to 6 do
begin
dq[i+2]:=q[i+3]-q[i+2];
d2q[i+1]:=dq[i+2]-dq[i+1];
dy[i+3]:=q[i+3]+((dq[i+2])/2)+(5*(d2q[i+1])/12)+(3*(d2q[i+1]-d2q[i])/8);
y[i+4]:=y[i+3]+dy[i+3];
q[i+4]:=h*ff(x[i+4],y[i+4]);
end;
for i:=1 to 10 do
writeln(y[i]:10:4);
readln;
end.
Відповідь:
x[1]= 0.000000000000E+000 y[1]=1.000000000000000E+000
x[2]= 0.20000000000000E+000 y[2]=-2.38352968598830E+000
x[3]= 0.40000000000000E+000 y[3]=-2.43736337303425E+000
x[4]= 0.60000000000000E+000 y[4]=- 2.526078 0521146E+000
x[5]= 0.80000000000000E+000 y[5]=-2,60789616983400E+000
x[6]= 1.0000000000000E+000 y[6]=-2.7088 631474325E+000
x[7]= 1.20000000000000E+000 y[7]=-2.84148900009743E+000
x[8]= 1.40000000000000E+000 y[8]=-3.02080025048269E+000
x[9]= 1.60000000000000E+000 y[9]=-3.26495899349582E+001
x[10]= 1.800000000000000E+000 y[10]=-3.5949000178810E+001
Завдання № 3
«Метод градієнтного спуску. Рішення системи нелінійних алгебраїчних рівнянь»
Теоретичні відомості:
Нехай маємо систему рівнянь
(1)
чи в матричній формі
, (2)
де , .
Припустимо, що функції дійсні й неперервно-диференційовані в їхній загальній області визначення. Розглянемо функцію
. (3)
Очевидно, що кожний розвязок системи (1) перетворює на нуль функцію ; навпаки, числа , для яких функція дорівнює нулю, є коренями системи (1). Таким чином, задача зводиться до знаходження мінімуму скалярної функції багатьох змінних .
Одним з методів мінімізації функцій багатьох змінних є метод градієнтного спуску. Якщо деяке наближення до розвязку системи, то в методі градієнтного спуску ми одержуємо нове наближення , рухаючись за напрямком найбільшої миттєвої швидкості зміни функції в точці до точки, де значення мінімальне, тобто
, (4)
де вибирається з умови мінімуму .
Якщо мала величина, квадратом і вищими ступенями якої можна знехтувати, то, розкладаючи функції за степенями з точністю до лінійних членів і виражаючи через матрицю Якобі , одержимо таке представлення розрахункової формули методу градієнтного спуску
, (5)
де матриця Якобі вектор-функції .
. (6)
Слід зазначити, що ітераційний процес, побудований за методом градієнтного спуску, збігається до точного розвязку, якщо початкове наближення обране з досить малого околу кореня.
Завдання:
Методом градієнтного спуску при заданому початковому наближенні знайдіть наближені корені системи
За умову закінчення ітераційного процесу прийміть .
№ варі-анта |
Матриця коефіцієнтів системи |
Стовпець вільних членів |
Початкове наближення коренів |
|||
20 |
-0,4 1,1 -3,5 -4,0 |
-2,5 3,2 -0,1 0,2 |
1,8 -2,6 1,4 -0,5 |
-2,0 0,5 -2,6 1,1 |
0,42576 -30,21898 -16,27821 -6,42578 |
3,0 0,4 -2,6 -1,0 |
Розвязання: type ar1=array[1..4,1..5] of real; ar2=array[1..4] of real; var k,i,j:integer; a1,c1:ar1; f:text; e,m,s,r:real; x1,x2,d1,p,q:ar2; procedure ff(a:ar1; x:ar2;var y:ar2); begin y[1]:=a[1,1]*x[1]*x[1]+a[1,2]*x[2]*x[3]+a[1,3]*x[2]*x[4]+a[1,4]*x[1]-a[1,5]; y[2]:=a[2,1]*x[2]*x[2]+a[2,2]*x[1]*x[3]+a[2,3]*x[3]*x[4]+a[2,4]*x[2]-a[2,5]; y[3]:=a[3,1]*x[3]*x[3]+a[3,2]*x[1]*x[2]+a[3,3]*x[2]*x[4]+a[3,4]*x[3]-a[3,5]; y[4]:=a[4,1]*x[4]*x[4]+a[4,2]*x[1]*x[2]+a[4,3]*x[2]*x[3]+a[4,4]*x[4]-a[4,5]; end; procedure dd(a:ar1;x:ar2;var c:ar1); begin c[1,1]:=2*a[1,1]*x[1]+a[1,4]; c[1,2]:=a[1,2]*x[3]+a[1,3]*x[4]; c[1,3]:=a[1,2]*x[2]; c[1,4]:=a[1,3]*x[2]; c[2,2]:=2*a[2,1]*x[2]+a[2,4]; c[2,3]:=a[2,2]*x[1]+a[2,3]*x[4]; c[2,4]:=a[2,3]*x[3]; c[2,1]:=a[2,2]*x[3]; c[3,3]:=2*a[3,1]*x[3]+a[3,4]; c[3,2]:=a[3,2]*x[1]+a[3,3]*x[4]; c[3,1]:=a[3,2]*x[2]; c[3,4]:=a[3,3]*x[2]; c[4,4]:=2*a[4,1]*x[4]+a[4,4]; c[4,2]:=a[4,2]*x[1]+a[4,3]*x[3]; c[4,1]:=a[4,2]*x[2]; c[4,3]:=a[4,3]*x[2]; end; begin assign(f,'g.txt'); reset(f); for i:=1 to 4 do for j:=1 to 5 do begin readln(f,s); a1[i,j]:=s; end; for i:=1 to 4 do begin readln(f,s); x2[i]:=s;end; close(f); e:=54; while e>4.3 do begin dd(a1,x2,c5); ff(a1,x2,d1); for i:=1 to 4 do begin s:=0; for j:=1 to 4 do s:=s+c1[j,i]*d1[j]; p[i]:=s; end; for i:=1 to 4 do begin s:=0; for i:=1 to 6 do s:=s+d1[i]*q[i]; r:=0; for i:=1 to 4 do r:=r+q[i]*q[i]; if r=0 then r:=1; m:=s/r; for i:=1 to 4 do x1[i]:=x2[i]-m*p[i]; for i:=1 to 4 do x2[i]:=x1[i]; ff(a1,x2,d1); e:=0; for i:=1 to 4 do e:=e+abs(d1[i]); writeln(e); end; writeln; for i:=1 to 4 do writeln(x2[i]); readln; ff(a1,x2,d1); for i:=1 to 4 do writeln(d1[i]); readln; end. Відповідь: x[1]=2.83391028226855E+000 x[2]= 1.52604035455125E-001 x[3]= -2.50422821563218E+000 x[4]=-1.36845473753385E+000 |
Завдання № 4
«Метод Гальоркіна. Рішення крайової задачі для звичайного диференціального рівняння»
Теоретичні відомості:
Нехай дана крайова задача
(1)
(2)
Для знаходження наближеного розвязку цієї задачі вчинимо так. Задаємося на деякою системою лінійно-незалежних функцій , неперервних і двічі неперервно-диференційованих. Причому функція повинна задовольняти неоднорідним крайовим умовам (2), а повинні задовольняти однорідним крайовим умовам, тобто крайовим умовам
.
Розглянемо функцію як лінійну комбінацію
(3)
де невідомі константи.
Якщо базисні функції вибрати так, як це було описано вище, то буде задовольняти крайовим умовам (2), незалежно від вибору .
Розглянемо функцію . Вона називається відхилом і отримується при підстановці в рівняння (1) виразу (3). Якщо відхил дорівнює нулю, то маємо випадок точного розвязоку. Задача розвязання звичайного диференціального рівняння зводиться до того, щоб відхил був мінімальним. Тоді вираз (3) буде наближеним розвязком задачі.
Підбір коефіцієнтів породжує різні методи.
Суть методу Гальоркіна полягає в тому, що базисні функції повинні бути ортогональні до відхилу.
Умова ортогональності двох функцій має вигляд:
,
В результаті одержимо систему лінійних алгебраїчних рівнянь щодо невідомих коефіцієнтів . Знайшовши ці коефіцієнти і підставивши їх у (3), одержимо наближений розвязок крайової задачі.
Завдання:
Розвяжіть крайову задачу методом Гальоркіна.
1 |
0 |
0 |
1 |
||||||||||
-3 |
2.5 |
0.5 |
0.5 |
1 |
2 |
2 |
0 |
-1 |
0 |
0.1 |
Розвязання:
var x:array[0..11] of real;
k,i,n,j:integer; f:text;
a:array[0..10] of real;
h,s,w1,w0,v1,v0,c,d,a1,b:real;
y:array[0..11,0..11] of real;
function pp(x:real):real;
begin pp:=-1*x-4.8 end; {}
function gg(x:real):real;
begin gg:=-1*x*x end; {}
function ff(x:real):real;
begin ff:=(x-4.8)/((x*x)+1) end; {}
begin
writeln('vvedite A i B');
readln(c);
readln(d);
writeln('vvedite a,b');
readln(a1);
readln(b);
writeln('vvedite h');
readln(h);
n:=10;x[0]:=a1;x[10]:=b;
for i:=1 to n-1 do begin
x[i]:=x[i-1]+h;end;
for i:=0 to n+1 do
for j:=0 to n+1 do begin
y[i,j]:=0; end;
for i:=1 to n-1 do
begin
y[i,i-1]:=1/(h*h)-pp(x[i])/(2*h);
y[i,i]:=-2/(h*h)+gg(x[i]);
y[i,i+1]:=1/(h*h)+pp(x[i])/(2*h);
end;
w1:=0;w0:=-1; {}
v0:=0;v1:=2; {}
y[n,0]:=w0-(3*w1)/(2*h);
y[n,1]:=4*w1/(2*h);
y[n,2]:=-w1/(2*h);
y[n+1,n]:=v0+(3*v1)/(2*h);
y[n+1,n-1]:=-4*v1/(2*h);
y[n+1,n-2]:=v1/(2*h);
for i:=1 to n+1 do
y[i,n+1]:=ff(x[i]);
y[n,n+1]:=c;
y[n+1,n+1]:=d;
for i:=1 to n+1 do
for j:=0 to n+1 do begin
writeln(f,y[i,j]);end;
close(f);
end.
Відповідь:
x[1]= 1.000000000000E+000 y[1]=1.194000000000000E+000
x[2]= 1.1000000000000E+000 y[2]=1.219852968598830E+000
x[3]= 1.20000000000000E+000 y[3]=1.23236337303425E+000
x[4]= 1.30000000000000E+000 y[4]=1.2306078 0521146E+000
x[5]= 1.40000000000000E+000 y[5]=1.203789616983400E+000
x[6]= 1.5000000000000E+000 y[6]=1.14288 631474325E+000
x[7]= 1.60000000000000E+000 y[7]=1.032148900009743E+000
x[8]= 1.70000000000000E+000 y[8]=0.652080025048269E+000
x[9]= 1.80000000000000E+000 y[9]=0.570495899349582E+001
x[10]= 1.900000000000000E+000 y[10]=0.143779000178810E+001
x[11]=2.0000000000000000+000 y[11]=-0.5060236686980E+001