Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
METODE NUMERICE
PROBLEME DE SEMINAR
S
I LUCRARI
DE LABORATOR
Simina Maris
Liliana Braescu
Timisoara
2007
Introducere
Procesul de restructurare al Invatamantului Superior din Romania si trecerea
acestuia pe trei cicluri, a determinat la nivelul ntregii tari elaborarea de noi
planuri de nvatamant si de programe analitice adecvate.
Metode numerice - Probleme de seminar si lucr
ari de laborator este un
material aditional la cursul de Metode numerice elaborat n acord cu noile
cerinte, pe baza programei analitice conceputa la nivelul Departamentului de
Informatica si aprobata n Consiliul Profesoral al Facultatii de Matematica
si Informatica de la Universitatea de Vest din Timisoara.
Problemele si lucrarile de laborator prezentate n aceasta carte se adreseaza n primul rand studentilor de la Facultatea de Matematica si Informatica,
fiind abordate toate temele din programa analitica, la nivelul studentilor
Sectiei de Informatica aflati n semestrul al cincilea de studiu, oferind exemple
si detalii referitoare la metodele numerice prezentate n curs.
Lucrarea este structurata pe sapte capitole, primul dintre acestea fiind
rezervat pentru prezentarea unui set de cunostinte minimale de programare
n Maple. Capitolele 2-7 corespund capitolelor din cursul de Metode numerice
si sunt organizate dupa cum urmeaza:
breviar teoretic
problema rezolvata
probleme propuse
implementare
Prin aceasta lucrare, autorii pun la dispozitia cititorilor toate cunostintele
necesare n vederea construirii de algoritmi si proceduri capabile sa ia ca
argument un obiect matematic si sa returneze un rezultat final.
Autorii
Cuprins
1 MapleV4 - scurt
a introducere
1.1 Reguli generale de introducere a comenzilor .
1.2 Pachete de programe . . . . . . . . . . . . . .
1.3 Constante, operatori si functii des utilizate . .
1.4 Structuri de date . . . . . . . . . . . . . . . .
1.5 Calcule cu matrice si vectori. Pachetul linalg
1.6 Grafice . . . . . . . . . . . . . . . . . . . . . .
1.7 Elemente de programare . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9
9
11
12
13
16
20
22
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
29
29
51
61
68
74
85
94
100
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
127
. 127
. 141
. 144
. 155
5 Derivare numeric
a
159
5.1 Aproximarea derivatei prin diferente finite . . . . . . . . . . . 159
7
CUPRINS
5.2 Aproximarea derivatei . . . . . . . . . . . . . . . . . . . . . . 163
6 Integrare numeric
a
165
6.1 Formule de tip Newton-Cotes . . . . . . . . . . . . . . . . . . 165
6.2 Formule de tip Gauss . . . . . . . . . . . . . . . . . . . . . . . 168
7 Ecuatii diferentiale
7.1 Metoda diferentelor finite . . . . . . . . .
7.2 Metoda lui Taylor . . . . . . . . . . . . . .
7.3 Metoda Runge-Kutta . . . . . . . . . . . .
7.4 Metoda Adams-Bashforth . . . . . . . . .
7.5 Metoda Adams-Moulton . . . . . . . . . .
7.6 Metoda predictor-corector . . . . . . . . .
7.7 Probleme la limita liniare . . . . . . . . .
7.8 Metoda colocatiei si metoda celor mai mici
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
patrate
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
173
. 174
. 179
. 185
. 191
. 197
. 198
. 202
. 209
Capitolul 1
MapleV4 - scurt
a introducere
Maple este un sistem de calcul algebric (CAS) dezvoltat de firma Maplesoft
(http://www.maplesoft.com), care poate fi utilizat n:
1. calcule simbolice;
2. calcule numerice;
3. programarea unor metode numerice;
4. reprezentari grafice.
In cele ce urmeaza, vom prezenta principalele elemente necesare n programarea unor metode numerice, corespunzatoare softului MapleV4.
1.1
INTRODUCERE
CAPITOLUL 1. MAPLEV4 - SCURTA
10
11
4
9. Pentru a nu retine eventuale atribuiri anterioare, este util ca pentru
rezolvarea unei probleme noi sa ncepem cu instructiunea
> restart;
1.2
Pachete de programe
INTRODUCERE
CAPITOLUL 1. MAPLEV4 - SCURTA
12
1.3
Semnificatie
fals
adevarat
constanta lui Euler
+
constanta lui Catalan
valoare de adevar necunoscuta
unitatea imaginara
secventa vida
13
Sintaxa
a+b, a-b
a*b, 2*a
a/b
^, **
!
max, min
a^b, a**b
n!
max(a,b,c),
min(a,b,c)
<,<=,>,>=,=,<>
:=
=
..
and, or, xor,
implies, not
f:=expr
a=b
x=a..b
Semnificatie
suma a + b (diferenta a b)
produsul a b, sau 2a
a
catul
b
puterea ab
factorialul 1 2 ... n
maximul (minimul) dintre a, b, c
operatori booleeni
operatorul de asignare f = expr
ecuatia a = b
axb
operatori logici
1.4
1.4.1
Sintaxa
sin(x) , ...
arctan(x), ...
ln(x), log10(x)
exp(x), exp(1)
sqrt(x)
abs(x)
Semnificatie
functii trigonometrice
logaritmi
functia exponentiala
radical
modul
INTRODUCERE
CAPITOLUL 1. MAPLEV4 - SCURTA
14
1.4.2
Liste
1.4.3
15
Multimi
O multime este o secventa de expresii, scrisa ntre acolade, {}, n care fiecare
element figureaza o singura data. De exemplu:
> ll:={1,2,5,2,4,2,7,2,a,2,c};
ll := {1, 2, 4, 5, 7, a, c}
Adaugarea unui nou element la multime, sau stergerea elementului de pe
pozitia n se face la fel ca la liste.
Multimea vida este desemnata prin {}.
Reuniunea a doua multimi se face utilizand operatorul union:
> s:={1,2,3} : t:={2,3,4} :
> s union t;
{1, 2, 3, 4}
Intersectia a doua multimi se realizeaza cu ajutorul operatorului intersect:
> s intersect t;
{2, 3}
Diferenta a doua multimi se realizeaza utilizand operatorul minus:
> s minus t;
{1}
> s minus s;
{}
1.4.4
S
iruri de caractere
INTRODUCERE
CAPITOLUL 1. MAPLEV4 - SCURTA
16
integer
> a+b;
a :=579+52
> whattype(a+b); # afla tipul expresiei a+b
symbol
1.5
17
1 2
a := 3 4
5 6
dar si
> f:=(i,j)->i+j; # functia generatoare a elem matricei
f := (i, j) i + j
> b:=matrix(2,3,f);
# adica b[i,j]=f(i,j)
2 3 4
b :=
3 4 5
Elementul aij se scrie a[i,j]. Astfel, pentru matricea a din exemplul anterior, putem avea:
> a[3,1];
5
18
INTRODUCERE
CAPITOLUL 1. MAPLEV4 - SCURTA
band(b,n)
Descriere
nlocuieste coloana c2 a matricei A cu
m*c1+c2
nlocuieste linia r2 a matricei A cu
m*r1+r2
calculeaza matricea adjuncta a matricei
A
calculeaza unghiul vectorilor u si v
concateneaza (alatura) matricile A si B
pe orizontala
rezolva sistemul Ux=b, prin substitutie
inversa, unde U este o matrice superior
triunghiulara
construieste o matrice n x n care are
pe diagonala principala elementele vectorului b, iar celelalte elemente sunt
nule
continuare pe pagina urm
atoare
19
Functie
cholesky(A)
col(A,i), col(A,i..k)
coldim(A)
crossprod(u,v)
delcols(A,r..s)
delrows(A,r..s)
det(A)
diverge(f)
dotprod(u,v)
exponential(A)
extend(A,m,n,x)
forwardsub(L,b)
gausselim(A)
geneqns(A,x)
genmatrix(sist, var)
grad(expr, vect)
inverse(A)
matadd(A,B,c1,c2)
minor(r,c)
Descriere
efectueaza descompunerea Cholesky a
matricei A
extrage coloana i, respectiv coloanele i
pana la k, din matricea A
returneaza numarul de coloane ale matricei A
returneaza produsul vectorial al vectorilor u si v
sterge coloanele de la r la s din matricea A
sterge liniile de la r la s din matricea A
calculeaza determinantul matricei A
calculeaza divergenta vectorului f
calculeaza produsul scalar al vectorilor
u si v
calculeaza eA
adauga m linii si n coloane matricei A,
initializate cu x
rezolva sistemul Lx=b prin substitutie
nainte, unde L este o matrice inferior
triunghiulara
efectueaza eliminarea gaussiana cu
semipivot asupra matricei A
genereaza un sistem de ecuatii pornind
de la matricea A si vectorul necunoscutelor x
genereaza matricea coeficientilor sistemului sist, in raport cu multimea
variabilelor var
calculeaza gradientul expresiei expr, in
functie de variabilele vect
calculeaza inversa matricei A
calculeaza c1*A+c2*B
calculeaza minorul de ordin (r,c)
(elimina linia r si coloana c) din matricea A
continuare pe pagina urm
atoare
INTRODUCERE
CAPITOLUL 1. MAPLEV4 - SCURTA
20
Functie
mulcol(A,c,expr)
Descriere
multiplica coloana c a matricei A cu expresia expr
mulrow(A,r,expr)
multiplica linia r a matricei A cu expresia expr
multiply(A,B)
efectueaza nmultirea matricelor A si B
norm(A)
calculeaza norma matricei A
normalize(v)
calculeaza versorul vectorului v
rank(A)
calculeaza rangul matricei A
row(A,i), row(A,i..j)
extrage linia i, respectiv liniile de la i
la j, ale matricei A
rowdim(A)
returneaza numarul de linii din matricea A
scalarmult(A,s)
nmulteste toate elementele matricei A
cu scalarul s
stack(A,B)
concateneaza matricele A si B pe verticala
submatrix(A,r1..r2,c1..c2) extrage o submatrice a matricei A, ntre
liniile r1, r2, si coloanele c1, c2
subvector(A,r1..r2)
extrage un subvector al vectorului A, de
la rangul r1 la rangul r2
swapcol(A,c1,c2)
interschimba coloanele c1 si c2 ale matricei A
swaprow(A,r1,r2)
interschimba liniile r1 si r2 ale matricei
A
trace(A)
calculeaza urma matricei A
vectdim(v)
returneaza dimensiunea vectorului v
1.6
Grafice
Graficul unei functii se realizeaza folosind comanda plot, a carei sintaxa este
plot(functie, x=x_min..x_max, y_min..y_max)
unde argumentul y_min..y_max este optional.
De exemplu, putem avea:
> plot(sin(x), x=-5..5);
21
1.6. GRAFICE
0.5
4
x
0.5
0.8
0.6
0.4
0.2
4
x
INTRODUCERE
CAPITOLUL 1. MAPLEV4 - SCURTA
22
0.5
4
x
0.5
Mai multe detalii despre grafice se pot gasi accesand pagina de help referitoare la instructiunea plot, sau la pachetul plots.
1.7
1.7.1
Elemente de programare
Conditionarea si ciclarea
A. Conditionarea
Sintaxa unei instructiuni conditionale este
if CONDITIE then EXPRESIE
[ elif CONDITIE then EXPRESIE ]
[ else EXPRESIE ]
fi
Instructiunile puse ntre paranteze patrate, [ ], sunt optionale.
De exemplu, putem avea secventa:
> if a<0 then -a else a fi; # pentru calculul modulului
pentru a returna modulul numarului a.
Un alt exemplu este dat de secventa:
> if x<0 then -1 elif x=0 then 0 else 1 fi; # functia signum
pentru a returna semnul unui numar (functia sgn).
B. Ciclarea
O instructiune repetitiva poate avea una din urmatoarele doua sintaxe:
23
24
INTRODUCERE
CAPITOLUL 1. MAPLEV4 - SCURTA
v1 := 1
v2 := 5
v3 := 19
[1, 5, 19]
M:=array(1..3,1..4); # definirea matricei
M := array(1..3, 1..4, [ ])
> for i from 1 to 3 do # definirea elem matricei
for j from 1 to 4 do
M[i,j]:=i^j
od;
od;
> evalm(M);
1 1 1 1
2 4 8 16
3 9 27 81
Putem afisa elemetele unei liste (secvente, multimi, matrice, vector) astfel:
> lista:=[3,2,4,5,1]:
> for i in lista do print(i) od;
Mai multe detalii despre instructiunile de conditionare si de ciclare se pot
gasi accesand pagina de help referitoare la acestea.
1.7.2
Functii si proceduri
25
proc (ARGUMENTE)
local VARIABILE_LOCALE;
global VARIABILE_GLOBALE;
options OPTIUNI;
description SIR_DE_CARACTERE;
INSTRUCTIUNI;
end;
O procedura returneaza ultimul rezultat obtinut. Pentru a forta returnarea
unui alt rezultat, se foloseste RETURN. De asemenea, pentru a returna un
mesaj de eroare, se foloseste ERROR.
De exemplu, putem defini procedura:
> modul:=proc(a) if a<0 then -a else a fi; end;
modul := proc(a) if a < 0 then a else a end if end proc
pe care o putem apela astfel:
> modul(-3);
3
Un alt exemplu de procedura este urmatorul:
> ec2:=proc(a,b,c)
local delta,x1,x2;
description Rezolvarea ecuatiei de gradul 2;
delta:=b^2-4*a*c;
if delta>0 then
x1:=(-b+sqrt(delta))/(2*a);
x2:=(-b-sqrt(delta))/(2*a);
RETURN(x1,x2);
elif delta=0 then RETURN(-b/(2*a));
else
RETURN(ecuatia nu ere solutii reale);
fi;
end:
care produce urmatoarele rezultate:
> ec2(1,6,9); # ecuatia x^2+6*x+9=0
3
> ec2(1,2,9); # ecuatia x^2+2*x+9=0
ecuatia nu are solutii reale
> ec2(1,2,-3); # ecuatia x^2+2*x-3=0
1, 3
26
INTRODUCERE
CAPITOLUL 1. MAPLEV4 - SCURTA
27
> rdc(4);
1
2
Pentru a putea urmari executia unei proceduri, se foloseste debug, iar
pentru a stopa urmarirea, se foloseste undebug. De exemplu, putem avea:
> f:=proc(a,b)
local y,z;
y:=a+b/2;
z:=1/y;
RETURN(y+z)
end;
f := proc(a, b)
local y, z;
y := a + 1/2 b; z := 1/y
RETURN(y + z) end proc
> debug(f);
f
> f(2,4);
{--> enter f, args = 2, 4
y := 4
1
z :=
4
<-- exit f (now at top level) = 17/4}
17
4
> f(0,1);
28
INTRODUCERE
CAPITOLUL 1. MAPLEV4 - SCURTA
Capitolul 2
Rezolvarea sistemelor liniare
In acest capitol vom prezenta metode de rezolvare a sistemelor liniare de
tip Cramer (numarul de ecuatii este egal cu numarul de necunoscute, si
determinantul matricei sistemului este nenul):
a x + a x + ...+ a x = b
21 1
22 2
2n n
2
(2.1)
.....................................
Deoarece n cele mai multe cazuri matricea A are numar mare de linii si
coloane, iar calculul matricei A1 este dificil si acumuleaza erori, se impun
metode directe si metode iterative pentru rezolvarea acestor sisteme.
2.1
2.1.1
30
aik
akk
a
11 a
12 ... a1,n2 a
1,n1
a
1,n
0 a
22 ... a2,n2 a
2,n1
a
2,n
... ... ...
...
...
...
0 ...
0
a
n1,n1 a
n1,n
0
0 ...
0
0
a
nn
superior triunghiulara
b1
x1
x2 b2
...
= ... (2.2)
xn1
bn1
bn
xn
bn
a
nn
(2.3)
xk =
bk
n
X
j=k+1
a
kj xj
1
, k = n 1, n 2, . . . , 1
a
kk
31
m1 = Bji
pentru k = 1, 2n
Bjk = Bjk m1 Bik
2.1.2
Probleme rezolvate
x+y+z =6
2x y + 3z = 9
x + 4y + z = 12.
Matricea sistemului este
1 1 1
A = 2 1 3 ,
1 4 1
1 1 1 6
A = (A, b) = 2 1 3 9 .
1 4 1 12
32
1 1 1 6
1 1 1 6
L2 L2 +m21 L1
L3 L3 +m31 L1
2 1 3 9
0 3 1 3
1 4 1 12
0 3 0 6
Pasul 2
pivot: a22 = 3
3
m32 =
=1
3
1 1 1 6
1 1 1 6
L3 L3 +m32 L2
0 3 1 3
0 3 1 3
0 3 0 6
0 0 1 3
In acest moment am ajuns la un sistem de forma Ax
= b, echivalent cu
1 1 1
x
6
b = 3 .
A = 0 3 1 ,
x= y ,
0 0 1
z
3
3
1
1
y=
(3 1 z)
3
1
x = (6 1 y 1 z),
1
z=
33
1 1 1 6
2 1 3
L2 L1
2 1 3 9
1 1 1
1 4 1 12
1 4 1
pe coloana 1. In
1 cu linia 2, si se
9
6
12
L2 L2 1 L1
2
2 1 3 9
2 1 3
L3 L3 21 L1
1 1 1 6
0 23 12
1 4 1 12
0 29 12
9
3
2
15
2
Pasul 2
Ca pivot se ia elementul ai2 de modul maxim de pe coloana 2, pentru
i 2. In cazul nostru, pivotul este a32 , deci se permuta linia 2 cu linia
3 si se fac zerouri pe coloana 2, pentru i > 2:
2 1 3 9
2 1 3 9
L3 L2
0 3 1 3
0 92 21 15
2
2
2
2
9
1
15
3
1
3
0 2 2 2
0 2 2 2
2 1 3
0 9 1
2
2
0 32 12
9
15
2
3
2
2 1 3
9
0 9 1 15
2
2
2
0 0 13 1
L3 L3 13 L2
2 1 3
x
9
b = 15 .
A = 0 29 12 ,
x= y ,
2
0 0 13
z
1
34
1 1 1 6
1 4 1 12
L3 L1
2 1 3 9
2 1 3 9
1 4 1 12
1 1 1 6
1 4 1 12
4 1 1 12
C2 C1
2 1 3 9
1 2 3 9
1 1 1 6
1 1 1 6
y
x
x x1
x
x = y 2
z
z
n final, obtinem:
L2 L2 + 1 L1
4
4 1 1 12
4 1
L3 L3 14 L1
1 2 3 9 0 9
4
1 1 1 6
0 34
1
13
4
3
4
12
12
3
Pasul 2
ca pivot se alege elementul aij de modul maxim pentru i, j 2.
Deoarece pivotul este a23 , se permuta coloana 3 cu coloana 2:
4 1
0 9
4
0 34
4
0
0
1
13
4
3
4
1
13
4
3
4
4
12
C3 C2
12
0
3
0
1
13
4
3
4
y
y
x3 x2
x
z
x=
z
x
1 12
4
3
L L3 13 L2
9
3
0
12
4
3
3
0
4
1 12
9
12
4
3
3
4
13
4
9
4
3
13
12
12
3
13
35
4 1 1
y
12
9
b = 12 .
A = 0 13
,
x= z ,
4
4
3
3
x
0 0 13
13
2 2
2 1
A=
3 1
matricei
3
1 .
2
Rezolvare
Consideram matricea B obtinuta prin
tricea unitate I3 :
2 2 3 1
2 1 1 0
B=
3 1 2 0
2 2 3 1 0
2 1 1 0 1
3 1 2 0 0
concatenarea matricei A cu ma
0 0
1 0 .
0 1
0
1 1 32 12 0 0
L1 B1 L1
11
0
2 1 1 0 1 0
1
3 1 2 0 0 1
3
1
L2L2B21 L1
1 1
1 1 23 12 0 0
0 0
2
2
L3L3B31 L1
2 1 1 0 1 0
0 1 2 1 1 0
3 1 2 0 0 1
0 2 52 32 0 1
3
1
3
1
1 1
0 0
1 1
0 0
L2 B1 L2
2
2
2
2
22
0 1 2 1 1 0
2
1 1 0
0 1
5
3
5
0 2 2 2 0 1
0 2 2 32 0 1
3
1
1
1
1 1
0
0
1
0
1
0
L1L1B12 L2
2
2
2
2
L3L3B32 L2
0 1
2
1 1 0
1 1 0
0 1 2
1
0 2 52 23 0 1
0 0 23
2 1
2
1 0 12 12 1 0
1 0 12 12 1 0
L3 B1 L3
33
0 1 2
1 1 0
1 1 0
0 1 2
3
1
1
0 0 2
2 1
0 0 1
43 23
2
3
36
1
1 0 12 12 1 0
1 0 0 13 31
L1L1B13 L3
3
L2L2B23 L3
5
0 1 2
43
1 1 0
0 1 0 13
3
1
4
2
1
4
3 3
0 0 1
0 0 1 3 3 23
3
1
3 3
3
5
34
C = 31
3
1
43 23
3
A C = C A = I3 .
2.1.3
Probleme propuse
Exercitiul 2.1.3. Sa se rezolve urmatoarele sisteme, folosind cele trei variante ale
metodei lui Gauss:
x + 2y + z = 1
3x y + 5z = 14
a)
x + y z = 2
x+y+z+t= 0
3x 2y z + t = 8
b)
x 2y z + 4t = 1
x + y z + 2t = 1
2.1.4
Implementare
A. Algoritm
Algoritmii pentru cele 3 metode sunt asemanatori, diferenta dintre ei
aparand (asa cum se poate vedea si din exemplul rezolvat) n modul de
rezolvare a eliminarii Gauss.
Date de intrare: un sistem de ecuatii (scris ca multime de ecuatii)
Date de iesire: solutia sistemului
Algoritmul consta din urmatoarele etape:
1. generarea matricei extinse a sistemului, A = (aij )i=1,n,j=1,n+1
n= numarul de ecuatii (numarul de linii ale matricei A);
37
an,n+1
,
ann
- pentru i = n 1, 1
1
xi =
aii
ai,n+1
n
X
j=i+1
aij xj .
38
39
for r from k to n do
if (abs(A1[r,k])>abs(A1[k,k])) then mx:=r
fi;
od;
if mx<>k then A1:=swaprow(A1,k,mx); fi;
for i from k+1 to n do
m:=A1[i,k]/A1[k,k];
for j from k to n+1 do
A1[i,j]:=A1[i,j]-m*A1[k,j];
od;
od;
od;
RETURN(evalm(A1));
end:
tpgauss:=proc(A::matrix)
local A1, A2, n, k, r, i, m, j, mx, my, l;
n:=rowdim(A);
A1:=A;
A2:=delcols(A1,n+1..n+1);
l:=[seq(i), i=1..n];
if(det(A2)=0) then ERROR(sistemul nu are solutie unica!) fi;
for k from 1 to n-1 do
mx:=k; my:=k;
for i from k to n do
for j from k to n do
if (abs(A1[i,j])>abs(A1[k,k])) then mx:=i; my:=j;
fi;
od;
od;
if mx<>k then A1:=swaprow(A1,k,mx); fi;
if my<>k then
A1:=swapcol(A1,k,my);
l:=subsop(k=l[my],my=l[k],l);
fi;
for i from k+1 to n do
m:=A1[i,k]/A1[k,k];
for j from k to n+1 do
A1[i,j]:=A1[i,j]-m*A1[k,j];
od;
od;
40
od;
RETURN(evalm(A1),l);
end:
gauss:=proc(eqn::set(equation), opt::symbol)
local A,A1,l,n,r,k,i,m,j,s,x,rez;
l:=[op(indets(eqn))];
n:=nops(l);
A:=genmatrix(eqn, l, flag);
if opt=clasic then A1:=cgauss(A);
elif opt=semipivot then A1:=spgauss(A);
elif opt=totalpivot then
rez:=tpgauss(A);
A1:=rez[1];
l:=[seq(l[rez[2][i]],i=1..n)];
else ERROR(optiunile sunt: clasic, semipivot sau totalpivot);
fi;
x[n]:=A1[n,n+1]/A1[n,n];
for i from n-1 by -1 to 1 do
s:=0;
for j from i+1 to n do
s:=s+A1[i,j]*x[j];
od;
x[i]:=1/A1[i,i]*(A1[i,n+1]-s);
od;
RETURN(seq(l[i]=x[i],i=1..n));
end:
Observatia 2.1.2. Instructiunea indets(set_eq) returneaza multimea nedeterminatelor sistemului set_eq. Deoarece ordinea elementelor acestei multimi
nu este neaparat aceeasi cu ordinea nedeterminatelor din prima ecuatie a sistemului, pot aparea diferente ntre rezultatele furnizate cu ajutorul codului
MAPLE si rezultatele calculate pe hartie. Desi matricea sistemului generata
cu ajutorul instructiunii indets nu este ntotdeauna aceeasi cu matricea
sistemului scrisa pe hartie, rezultatele furnizate de program vor fi aceleasi
(eventual ordinea solutiilor va fi schimbata).
Observatia 2.1.3. Pentru a urmari executia unei proceduri, se foloseste
instructiunea debug. In cazul programelor din exemplele de mai sus, se
poate folosi urmatorul set de instructiuni:
debug(cgauss):
41
gauss({x+y+z=6,2*x-y+3*z=9,x+4*y+z=12},clasic);
1
1 1
A := 2 1 3
1
4 1
{--> enter cgauss, args = A
6
9
12
n := 3
A1 := A
1
1 1
A2 := 2 1 3
1
4 1
m := 2
A1 2, 1 := 0
A1 2, 2 := 3
A1 2, 3 := 1
A1 2, 4 := 3
m := 1
A1 3, 1 := 0
A1 3, 2 := 3
A1 3, 3 := 0
A1 3, 4 := 6
m := 1
A1 3, 2 := 0
A1 3, 3 := 1
A1 3, 4 := 3
<-- exit cgauss (now in gauss) = array(1 .. 3, 1 .. 4,[(3, 3)=1,(2,
1)=0,(3, 2)=0,(1, 3)=1,(3, 1)=0,(1, 4)=6,(2, 2)=-3,(2, 3)=1,(3,
4)=3,(1, 2)=1,(1, 1)=1,(2, 4)=-3])}
42
1
1 1
6
A1 := 0 3 1 3
0
0 1
3
x3 := 3
s := 0
s := 3
x2 := 2
s := 0
s := 2
s := 5
x1 := 1
1
1 1 6
A := 2 1 3 9
1
4 1 12
1
1 1
A2 := 2 1 3
1
4 1
mx := 1
mx := 2
2 1 3 9
1 1 6
A1 := 1
1
4 1 12
1
2
:= 0
m :=
A1 2, 1
3
2
1
:=
2
A1 2, 2 :=
A1 2, 3
43
3
2
1
2
:= 0
m :=
A1 3, 1
9
2
1
A1 3, 3 :=
2
15
A1 3, 4 :=
2
mx := 2
mx := 3
2 1 3
9 1
0
A1 :=
2
2
3 1
0
2
2
1
m :=
3
A1 3, 2 := 0
A1 3, 2 :=
9
15
2
3
2
1
3
:= 1
A1 3, 3 :=
A1 3, 4
2 1 3
9
9 1 15
A1 :=
2
2
2
1
0 0
1
3
x3 := 3
s := 0
3
s :=
2
x2 := 2
s := 0
s := 2
s := 7
x1 := 1
44
gauss({x+y+z=6,2*x-y+3*z=9,x+4*y+z=12},totalpivot);
1
1 1 6
A := 2 1 3 9
1
4 1 12
1
1 1
A2 := 2 1 3
1
4 1
l := [1, 2, 3]
mx := 1
my := 1
mx := 2
my := 1
mx := 2
my := 3
mx := 3
my := 2
1
4 1 12
A1 := 2 1 3 9
1
1 1 6
4 1 1 12
A1 := 1 2 3 9
1 1 1 6
l := [2, 1, 3]
1
m :=
4
A1 2, 1 := 0
A1 2, 2 :=
9
4
45
A1 2, 3 :=
A1 2, 4
1
4
:= 0
m :=
A1 3, 1
3
4
3
A1 3, 3 :=
4
A1 3, 4 := 3
A1 3, 2 :=
mx
my
mx
my
:= 2
:= 2
:= 2
:= 3
1 1 12
13 9
12
0
A1 :=
4 4
3 3
0
3
4 4
l := [2, 3, 1]
3
m :=
13
A1 3, 2 := 0
3
13
3
A1 3, 4 :=
13
<-- exit tpgauss (now in gauss) = array(1 .. 3, 1 .. 4,[(1,
4)=12,(2, 3)=9/4,(1, 1)=4,(1, 2)=1,(2, 1)=0,(3, 1)=0,(3, 4)=3/13,(3,
2)=0,(3, 3)=3/13,(1, 3)=1,(2, 4)=12,(2, 2)=13/4]), [2, 3, 1]}
4 1
1 12
13 9
12
0
rez :=
, [2, 3, 1]
4
4
3
3
0 0
13 13
4 1
1 12
13 9
12
0
A1 :=
4
4
3
3
0 0
13 13
A1 3, 3 :=
46
>
>
1
1 1 6
A := 2 1 3 9
1
4 1 12
gausselim(A);
1
1 1
6
0 3 1 3
0
0 1
3
backsub(%);
[1, 2, 3]
Redam programul Maple pentru determinarea inversei unei matrice, precum si un exemplu:
invmatrix:=proc(A::matrix)
local n,A1,i,B,j,m,m1,k,C;
n:=rowdim(A);
if coldim(A) <> n then
ERROR(Matricea trebuie sa fie patratica!)
fi;
if det(A)=0 then
ERROR(Matricea trebuie sa fie nesingulara!)
47
>
debug(invmatrix):
>
C:=invmatrix(A);
0 0 0
A1 := 0 0 0
0 0 0
A1 1, 1 := 1
A1 2, 2 := 1
A1 3, 3 := 1
2
1 1 1 0 0
B := 2 1 3 0 1 0
1
4 1 0 0 1
m := 2
B1, 1 := 1
B1, 2 :=
1
2
48
B1, 6 := 0
m1 := 2
B2, 1 := 0
B2, 2 := 2
B2, 3 := 2
B2, 4 := 1
B2, 5 := 1
B2, 6 := 0
m1 := 1
B3, 1 := 0
7
2
1
B3, 3 :=
2
1
B3, 4 :=
2
B3, 5 := 0
B3, 2 :=
B3, 6 := 1
m := 2
B2, 1 := 0
B2, 2 := 1
B2, 3 := 1
1
2
1
B2, 5 :=
2
B2, 6 := 0
B2, 4 :=
1
2
:= 1
m1 :=
B1, 1
B1, 2 := 0
B1, 3 := 1
49
7
2
:= 0
m1 :=
B3, 1
B3, 2 := 0
B3, 3 := 4
9
4
7
B3, 5 :=
4
B3, 6 := 1
B3, 4 :=
m := 4
B3, 1 := 0
B3, 2 := 0
B3, 3 := 1
9
16
7
B3, 5 :=
16
1
B3, 6 :=
4
m1 := 1
B1, 1 := 1
B3, 4 :=
B1, 2 := 0
B1, 3 := 0
13
16
3
B1, 5 :=
16
1
B1, 6 :=
4
m1 := 1
B2, 1 := 0
B1, 4 :=
B2, 2 := 1
B2, 3 := 0
50
13 3 1
1 0 0 16 16
4
1
1
1
0 1 0
16 16
4
9
7
1
0 0 1
16 16
4
13 3 1
16 16
4
1 1
1
C :=
16 16
4
9
7
1
16 16
4
<-- exit invmatrix (now at top level) = array(1 .. 3, 1 .. 3,[(1,
2)=-3/16,(2, 3)=1/4,(3, 2)=7/16,(3, 1)=-9/16,(2, 1)=-1/16,(1,
1)=13/16,(3, 3)=1/4,(2, 2)=-1/16,(1, 3)=-1/4])}
13 3 1
16 16
4
1 1
1
C :=
16
16
4
9
7
1
B2, 4 :=
16
>
16
multiply(A,C);
1 0 0
0 1 0
0 0 1
>
multiply(C,A);
1 0 0
0 1 0
0 0 1
51
2.2. FACTORIZAREA LU
2.2
2.2.1
Factorizarea LU
Breviar teoretic
(2.4)
11 0 . . . 0
11 12 . . . 1n
21 22 . . . 0
0 22 . . . 2n
L=
U
=
(2.5)
. . . . . . . . . . . .
. . . . . . . . . . . . .
n1 n2 . . . nn
0
0 . . . nn
si
b1
y1 = 11
i1
X
1
yi = bi
, i = 2, 3, . . . , n
ij yj
ii
j=1
Ux = y
(2.7)
(2.8)
cu solutia
yn
xn =
nn X
n
1
, i = 2, 3, . . . , n.
ij xj
xi = yi
ii
j=i+1
(2.9)
52
2.2.2
Problem
a rezolvat
a
x+yz =2
2x y + z = 1
x + 3y 2z = 5.
Sistemul se scrie n forma matriceala:
Ax = b,
unde
1
1 1
A = 2 1
1 ,
1
3 2
Deoarece
1
1
1 6= 0 ,
2 1
x
x= y ,
z
= 3 6= 0 ,
1
1 1
2 1
1
1
3 2
2
b = 1 .
5
= 3 6= 0 ,
1
1 1
11 0
0
1 12 13
1 = 21 22 0 0 1 23 ,
A = 2 1
1
3 2
31 32 33
0 0
1
= 11 1
= 11 12
= 11 13
= 21 1
= 21 12 + 22 1
= 21 13 + 22 23
= 31 1
= 31 12 + 32 1
= 31 13 + 32 23 + 33 1
11 = 1
12 = 1
13 = 1
21 = 2
22 = 3
23 = 1
31 = 1
32 = 2
33 = 1
53
2.2. FACTORIZAREA LU
sau
1
0 0
L = 2 3 0 ,
1
2 1
1 1 1
U = 0 1 1 .
0 0
1
1
0 0
y1
2
2 3 0 y2 = 1 ,
1
2 1
y3
5
a carui solutie este
y1
2
y2
1 ,
y=
=
y3
1
si respectiv:
1 1 1
x
2
0 1 1 y = 1 ,
0 0
1
z
1
a carui solutie este
x
1
y
2 .
x=
=
z
1
Rezolvare folosind factorizarea Doolittle
A. Factorizarea Doolittle
Presupunem ca
1
1 1
1
0 0
11 12 13
1 = 21 1 0 0 22 23
A = 2 1
1
3 2
31 32 1
0
0 33
si ne propunem sa determinam coeficientii lij , jk , la fel ca si n exemplul
54
= 1 11
= 1 12
= 1 13
= 21 11
= 21 12 + 1 22
= 21 13 + 1 23
= 31 11
11
12
13
21
22
23
31
a32 = 31 12 + 32 22
32
a33 = 31 13 + 32 23 + 1 33
33
sau
1
0 0
1 0 ,
L= 2
1 32 1
=1
=1
= 1
=2
= 3
=3
=1
2
=
3
=1
1
1 1
3 .
U = 0 3
0
0
1
1
0 0
y1
2
2
1 0
y2
=
1 ,
2
1 3 1
y3
5
a carui solutie este
2
y1
y = y2 = 3 ,
y3
1
si respectiv:
1
1 1
x
2
0 3
3 y = 3 ,
0
0
1
z
1
x
1
x = y = 2 .
z
1
55
2.2. FACTORIZAREA LU
2.2.3
Probleme propuse
x + 2y + z = 1
3x y + 5z = 14
a)
x + y z = 2
3x + y 2z = 1
x+y+z =6
b)
2x y + 4z = 7
2.2.4
Implementare
A. Algoritm
Date de intrare: un sistem de ecuatii
Date de iesire: solutia sistemului
Algoritmul consta din urmatoarele etape:
1. generarea matricei A a sistemului, si a vectorului coloana b
n = numarul de linii ale matricei A (numarul de ecuatii ale sistemului)
2. a) factorizarea Crout
pentru i = 1, n
ii = 1
pentru i = 1, n
pentru j = 1, i
ij = aij
j1
X
ik kj
k=1
pentru j = i + 1, n
1
ij =
ii
aij
i1
X
k=1
b) factorizarea Doolittle
pentru i = 1, n
ii = 1
pentru i = 1, n
pentru j = 1, i 1
ik kj
56
aij
pentru j = i, n
ij = aij
i1
X
i
X
ik kj
k=1
ik kj
k=1
yn
nn
pentru i = 2, n
n
X
1
xi = yi
ij xj
ii
j=i+1
B. Programe MAPLE si rezultate
Deoarece cele doua variante ale descompunerii LU difera doar prin modul
de factorizare a matricei sistemului, am implementat separat cele doua variante de factorizare: LUcrout si LUdoolittle, dupa care le-am folosit ca
optiuni n procedura finala LUsist.
restart: with(linalg):
LUcrout:=proc(A::matrix)
local a1,n,l,u,i,s,j,k;
n:=rowdim(A);
a1:=A;
if a1[1,1]=0 then
ERROR(factorizarea LU nu este aplicabila!);
fi;
for i from n by -1 to 2 do
if det(a1)<>0 then a1:=delrows(delcols(a1,i..i),i..i);
else ERROR(factorizarea LU nu este aplicabila!);
2.2. FACTORIZAREA LU
fi;
od;
l:=matrix(n,n,0); u:=matrix(n,n,0);
for i from 1 to n do
u[i,i]:=1;
od;
for i from 1 to n do
for j from 1 to i do
s:=0; for k from 1 to j-1 do s:=s+l[i,k]*u[k,j]; od;
l[i,j]:=A[i,j]-s;
od;
for j from i+1 to n do
s:=0; for k from 1 to i-1 do s:=s+l[i,k]*u[k,j]; od;
u[i,j]:=1/l[i,i]*(A[i,j]-s);
od;
od;
RETURN(evalm(l), evalm(u));
end:
LUdoolittle:=proc(A::matrix)
local a1,n,l,u,i,s,j,k;
n:=rowdim(A);
a1:=A;
if a1[1,1]=0 then
ERROR(factorizarea LU nu este aplicabila!);
fi;
for i from n by -1 to 2 do
if det(a1)<>0 then a1:=delrows(delcols(a1,i..i),i..i);
else ERROR(factorizarea LU nu este aplicabila!);
fi;
od;
l:=matrix(n,n,0); u:=matrix(n,n,0);
for i from 1 to n do
l[i,i]:=1;
od;
for i from 1 to n do
for j from 1 to i-1 do
s:=0; for k from 1 to i do s:=s+l[i,k]*u[k,i]; od;
l[i,j]:=1/u[j,j]*(A[i,j]-s);
od;
for j from i to n do
57
58
1 1
1 2
eqm := 1 2 1 1
2 1
3 5
59
2.2. FACTORIZAREA LU
lst := {z, x, y}
n := 3
1 1
1
A := 1 2 1
2 1
3
b := [2, 1, 5]
1 0 0
1 1 1
lu := 1 1 0 , 0 3 0
1
0 0 1
2
1
3
1 0 0
L := 1 1 0
1
2
1
3
1 1 1
U := 0 3 0
0 0 1
s := 0
aux 1 := 2
s := 0
s := 2
aux 2 := 3
s := 0
s := 4
s := 3
aux 3 := 2
s := 0
rez 3 := 2
s := 0
s := 0
rez 2 := 1
s := 0
s := 1
s := 3
rez 1 := 1
LUsist({x+y-z=2,2*x-y+z=1,x+3*y-2*z=5}, Crout);
60
1 1
1 2
eqm := 1 2 1 1
2 1
3 5
lst := {z, x, y}
n := 3
1 1
1
A := 1 2 1
2 1
3
b := [2, 1, 5]
1
0 0
1
3 0 , 0
lu := 1
2 1 1
0
1
0 0
L :=
1
3 0
2 1 1
1 1 1
U := 0
1
0
0
0
1
s := 0
aux 1 := 2
s := 0
s := 2
aux 2 := 1
s := 0
s := 4
s := 3
aux 3 := 2
s := 0
rez 3 := 2
s := 0
s := 0
rez 2 := 1
s := 0
s := 1
s := 3
rez 1 := 1
1 1
1
0
0
1
61
2.3
2.3.1
Sisteme tridiagonale
Breviar teoretic
b1 c2
0
a2 b2 c3
0 a3 b3
A=
0 ... ...
0 ... ...
0 ... ...
... 0
0 ... ...
... 0
c3 . . . . . .
... 0
.
. . . . . . an1 bn1 cn
... ...
0
an bn
(2.10)
1 0
0 ...
0
0
a2 2 0 . . .
0
0
(2.11)
L=
0
0
0 . . . n1 0
0
0
0 . . . an n
si
1 2
0 ... 0
0
0
1 3 . . . 0
0
U =
.
0
0
0 . . . 1 n
0
0
0 ... ... 1
(2.12)
1 = b1
i i+1 = ci+1 , i = 2, n 1
ai i + i = bi , i = 2, n
(2.13)
62
2.3.2
Problem
a rezolvat
a
x +2y
=3
2x y +z
=2
3y +2z t = 4
2z +t = 1.
Rezolvare
Matricea sistemului este
1
2
0
0
2 1
1
0
A=
0
3
2 1
0
0 2
1
1 0 0 0
1
2
0
0
2 1
1
0 2 2 0 0
=
0
3
2 1 0 3 3 0
0 0 2 4
0
0 2
1
1 2 0 0
0 1 3 0
0 0 1 4
0 0 0 1
1 = 1
2 = 2
2 = 5
1
3 =
5
13
3 =
5
5
4 =
13
3
4 = .
13
1 0
0 0
y1
3
2 5 0 0 y2 2
13
0 3
y3 = 4 ,
0
5
3
0 0 2 13
y4
1
63
si respectiv:
1
0
0
0
2.3.3
y1
3
y2 4
5
y3 = 8
13
y4
1
2 0
0
x
1
1 5
0 y
5
z
0 1 13
0 0
1
t
x
1
y 1
=
z 1
t
1
3
4
5
8
13
Probleme propuse
Exercit
iul 2.3.2. Sa se rezolve sistemele tridiagonale:
x+y = 3
2x y + z = 1
a)
3y z = 5
2x + y = 0
x y + 2z = 1
b)
2y z + t = 5
z + 2t = 5.
2.3.4
Implementare
A. Algoritm
Date de intrare: un sistem de ecuatii tridiagonal
Date de iesire: solutia sistemului
Algoritmul consta n:
1. generarea matricei A a sistemului (matrice tridiagonala) si a vectorului
coloana b
n = numarul de linii ale matricei A
2. descompunerea LU aplicata matricei tridiagonale A
L = (ij )i,j=1,n , U = (ij )i,j=1,n
64
65
66
od;
opst:=ops[1];
for i from 1 to n do
for j from 1 to nops(ops[i]) do
if not(ops[i][j] in opst) then
opst:=[op(opst),ops[i][j]]
fi;
od;
od;
RETURN(opst);
end:
tridiagonalsist:=proc(l::set(equation))
local eqm, opst, A, b, n, lu, L, U, i, s, j, aux, rez;
n:=nops(l);
opst:=nedeterminate(l);
eqm:=genmatrix(l, opst, flag);
A:=delcols(eqm,n+1..n+1);
b:=col(eqm,n+1);
lu:=tridiagonal(A);
L:=lu[1];
U:=lu[2];
aux[1]:=b[1]/L[1,1];
for i from 2 to n do
aux[i]:=1/L[i,i]*(b[i]-L[i,i-1]*aux[i-1])
od;
rez[n]:=aux[n];
for i from n-1 by -1 to 1 do
rez[i]:=aux[i]-U[i,i+1]*rez[i+1];
od;
RETURN(seq(opst[i]=rez[i], i=1..n));
end:
debug(tridiagonalsist):
tridiagonalsist({x+2*y=3,2*x-y+z=2, 3*y+2*z-t=4, -2*z+t=-1});
{--> enter tridiagonalsist, args = {x+2*y = 3, 2*x-y+z = 2, 3*y+2*z-t
= 4, -2*z+t = -1}
67
1
2
0
0
2 1
1
0
eqm :=
0
3
2 1
0
0 2
1
1
2
0
0
2 1
1
0
A :=
0
3
2 1
0
0 2
1
1
2
lu := 0
3
2
4
1
b := [3, 2, 4, 1]
1 2 0
0 0
0
1
5 0
0
0 1
5
13
3
0 ,
0 0 1
5
3
0 2
0 0 0
13
1
0 0
0
2 5 0
0
13
L := 0
3
0
3
0
0 2
13
1 2 0
0
1
0
0 1
U :=
5
0 0 1
13
0 0
aux 1 := 3
4
aux 2 :=
5
8
aux 3 :=
13
aux 4 := 1
rez 4 := 1
rez 3 := 1
rez 2 := 1
rez 1 := 1
13
1
68
2.4
2.4.1
Factorizarea Cholesky
Breviar teoretic
Un caz particular de sisteme liniare este acela n care matricea A a sistemului este simetrica si pozitiv definita (adica toti determinantii de colt sunt
strict pozitivi). Pentru astfel de sisteme putem folosi un caz particular al
factorizarii LU: descompunem matricea A a sistemului ntr-un produs L LT ,
unde
11 0 . . . 0
21 22 . . . 0
L=
(2.14)
. . . . . . . . . . . . .
n1 n2 . . . nn
Coeficientii ij se obtin din definitia produsului a doua matrice.
2.4.2
Problem
a rezolvat
a
x + 2y + z = 5
2x + 5y + 2z = 11
x + 2y + 3z = 7.
Rezolvare
A. Factorizarea Cholesky
Matricea sistemului este
1 2 1
A= 2 5 2
1 2 3
Se observa ca aij = aji , adica matricea A este simetrica. Deoarece
1 > 0,
1 2
2 5
= 1 > 0,
1 2 1
2 5 2
1 2 3
= 2 > 0,
69
1 2 1
11
0
0
11 21 31
0 0 22 32 .
A = 2 5 2 = 21 22
1 2 3
31 32 33
0
0 33
Folosind definitia produsului a doua matrice, obtinem:
a11
a12
a13
a22
a23
= 211
= 11 21
= 11 31
= 221 + 222
= 21 31 + 22 32
11
21
31
22
32
33
=1
=2
=1
=1
=0
= 2.
1 0
0
y1
5
2 1
y2 = 11 ,
0
y3
7
1 0
2
cu solutia
5
y1
y2 = 1 ,
y3
2
si
cu solutia
1 2
1
5
x
0 1
y = 1 ,
0
z
0 0
2
2
x
2
y = 1 .
z
1
70
2.4.3
Probleme propuse
3x + y + 4z = 12.
2.4.4
Implementare
A. Algoritm
Date de intrare: un sistem de ecuatii
Date de iesire: solutia sistemului
Algoritm
1. generarea matricei A a sistemului (simetrica si pozitiv definita) si a
vectorului b
n = numarul de ecuatii ale sistemului (numarul de linii ale matricei
A)
2. factorizarea Cholesky
11 = a11
pentru i = 2, n
pentru j = 1, i 1
j1
X
1
ij =
aij
ik jk
jj
k=1
v
u
i1
X
u
2ik
ii = taii
k=1
yn
xn =
nn
yi
n
X
k=i+1
ki xk
1
ii
71
72
nedeterminate:=proc(l::list(equation))
local n,i,j,ops,opst;
n:=nops(l);
for i from 1 to n do
ops[i]:=[seq(op(op(l[i])[1])[j]/
coeff(op(l[i])[1],op(indets(op(op(l[i])[1])[j]))),
j=1..nops(op(l[i])[1]))];
od;
opst:=ops[1];
for i from 1 to n do
for j from 1 to nops(ops[i]) do
if not(ops[i][j] in opst) then
opst:=[op(opst),ops[i][j]]
fi;
od;
od;
RETURN(opst);
end:
choleskysist:=proc(l::list(equation))
local lst, eqm, A, b, n, lu, L, U,i,s,j,aux, rez, rfin;
lst:=nedeterminate(l);
eqm:=genmatrix(l, lst, flag);
n:=nops(lst);
A:=delcols(eqm,n+1..n+1);
b:=col(eqm,n+1);
lu:=desccholesky(A);
L:=lu;
U:=transpose(lu);
for i from 1 to n do
s:=0; for j from 1 to i-1 do s:=s+L[i,j]*aux[j] od;
aux[i]:=1/L[i,i]*(b[i]-s)
od;
for i from n by -1 to 1 do
s:=0; for j from i+1 to n do s:=s+U[i,j]*rez[j] od;
rez[i]:=1/U[i,i]*(aux[i]-s)
od;
RETURN(seq(lst[i]=rez[i], i=1..n));
end:
73
1 2 1 5
eqm := 2 5 2 11
1 2 3 7
n := 3
1 2 1
A := 2 5 2
1 2 3
b := [5,
1
lu := 2
1
11, 7]
0 0
1 0
2
0
L := lu
1 2 1
U := 0 1 0
0 0
2
s := 0
aux 1 := 5
s := 0
s := 10
aux 2 := 1
s := 0
s := 5
s := 5
aux 3 := 2
s := 0
rez 3 := 1
s := 0
s := 0
rez 2 := 1
s := 0
s := 2
s := 3
rez 1 := 2
74
2.5
2.5.1
Factorizarea Householder
Breviar teoretic
(2.15)
T y = Ub.
(2.16)
(2.18)
2 v vT
kvk2
(2.20)
75
1 0 ... 0
0
U1 =
(2.21)
Pn1
0
este simetrica si verifica relatia:
A(1)
a11
1
= U1 A U1 = 0
1
(1)
a22
(1)
a32
(1)
an2
0
(1)
a23
(1)
a33
(1)
an3
... 0
(1)
. . . a2n
(1)
. . . a3n
(1)
. . . ann
(2.22)
... 0
... 0
(2)
. . . a3n
(2)
. . . ann
(2.24)
1 0 0 ... 0
0 1 0 . . . 0
0 0
(2.23)
U2 =
.. ..
. .
Pn2
0 0
are proprietatea:
A(2)
a11 1
0
0
a(1)
0
1
2
22
(2)
(1)
= U2 A U2 = 0 2 a33 a(2)
34
(2)
(2)
0
0 an3 an4
Matricea Pn2 a condus la obtinerea unei noi linii si coloane a matricei tridiagonale la care vrem sa reducem matricea A.
Continuand astfel prin n 1 transformari, obtinem egalitatea: UAU = T
n care T este matrice tridiagonala.
76
2.5.2
Problem
a rezolvat
a
2x + 2y + z =2
2x y + z = 5
x + y + 2z = 0.
Rezolvare
Sistemul se poate scrie sub forma Ax = b, unde:
2
2
2 1
A := 2 1 1 si b := 5
1
1 2
0
v = a1 + sign(a111 ) ka1 k e1
v = (0, 2 + 5, 1)T
2vj vk
.
kvk
1
0
0
0 2 (2 + 5) 2 + 5
U =
5+2 5
5+2 5
2+ 5
2 (2 + 5)
0
5+2 5
5+2 5
si
5 (2 + 5)
5+2 5
2
9
2
T = UAU = 5 (2 + 5)
, Ub = 2
5
5
5+2 5
1
9
3
0
5
5
77
y=
1
20 10 5
21
56 5
15
x = Uy =
2+ 5
3
2 5
3
2
2+ 5
2 5
2
,y=
z= .
adica x =
3
3
3
2.5.3
Probleme propuse
x + 3y 2z = 3
x+yz+t=3
x + 2y + 3z + t = 9
b)
x + 3y + 2t = 7
x + y + 2z = 5.
2.5.4
Implementare
A. Algoritm
Date de intrare: un sistem de ecuatii
Date de iesire: solutia sistemului, obtinuta folosind factorizarea Householder
Algoritmul consta din urmatoarele etape:
78
ei+1 = 1
pentru j = i + 2 . . . n
ej = 0
pentru j = i + 1 . . . n
vj = aij + sign(ai,i+1 ) norm a ej
norm v=
n
X
vj2
j=i+1
//Generam matricea U
j = i + 1...n
k = i + 1...n
ujk = ujk 2 vj vk / norm v
// D=AU
m = 1...n
l = 1...n
dml =
n
X
amk ukl
n
X
umk dkl
k=1
//A=UD=UAU
m = 1...n
l = 1...n
aml =
k=1
79
80
e:=vector(n,0);
v:=vector(n,0);
norma:= simplify(sqrt(sum(A[i,k1]^2, k1=i+1..n)));
e[i+1]:=1;
for j from i+1 to n do
v[j]:=A[i,j]+signum(A[i,i+1])*norma*e[j]
od;
normv:=simplify(sum(v[k1]^2, k1=i+1..n));
for j from i+1 to n do
for k from i+1 to n do
U[j,k]:=simplify(U[j,k]-2*v[j]*v[k]/normv);
od;
od;
evalm(U);
A:=simplify( multiply( U, multiply(A,U) ) );
b:=simplify( multiply(U,b) );
UD:=multiply(UD,U);
od;
lu:=tridiagonal(A);
LL:=simplify(lu[1]);
UU:=simplify(lu[2]);
aux[1]:=simplify(b[1]/LL[1,1]);
for i from 2 to n do
aux[i]:=simplify(1/LL[i,i]*(b[i]-LL[i,i-1]*aux[i-1]))
od;
rez[n]:=aux[n];
for i from n-1 by -1 to 1 do
rez[i]:=simplify(aux[i]-UU[i,i+1]*rez[i+1]);
od;
rez:=simplify(multiply(UD,rez));
RETURN(seq(opst[i]=rez[i], i=1..n));
end:
debug(householder):
householder([x-y+2*z+2*t=0,-x+y+3*z=-1,2*x+3*y-z+2*t=2,2*x+2*z=1]);
{--> enter householder, args = [x-y+2*z+2*t = 0, -x+y+3*z = -1,
2*x+3*y-z+2*t = 2, 2*x+2*z = 1]
n := 4
opst := [x, y, z, t]
81
1 1
2 2
1
1
3 0
eqm :=
2
3 1 2
2
0
2 0
1 1
2 2
1
1
3 0
A :=
2
3 1 2
2
0
2 0
0
1
2
1
b := [0, 1, 2, 1]
rez := [0,
0
0
UD :=
0
0
0, 0, 0]
0
0
0
0
0
0
0
0
0
0
0
0
UD 1, 1 := 1
UD 2, 2 := 1
UD 3, 3 := 1
UD 4, 4 := 1
0 0 0
0 0 0
U :=
0 0 0
0 0 0
U1, 1 := 1
0
0
0
0
U2, 2 := 1
U3, 3 := 1
U4, 4 := 1
e := [0, 0, 0, 0]
v := [0, 0, 0, 0]
norma := 3
e2 := 1
v2 := 4
v3 := 2
v4 := 2
normv := 24
1
U2, 2 :=
3
2
U2, 3 :=
3
82
1 0
0
0
2
2
0 1
3
3
3
2
1
0 2
3
3
3
2
1
2
0
3
3
3
1 3
0
0
4
19
3 1
9
9
9
A :=
4
16
22
0
9
9
9
19 22 17
0
9
9
9
7 1 2
b := 0, , ,
3 3 3
1 0
0
0
2
2
0 1
3
3
3
UD :=
2
1
0 2
3
3
3
2
1
2
0
3
3
3
0 0 0 0
0 0 0 0
U :=
0 0 0 0
0 0 0 0
U2, 4 :=
83
377
norma :=
9
e3 := 1
4
377
v3 := +
9
9
19
v4 :=
9
754 8 377
normv :=
+
81
81
4 (4 + 377)
U3, 3 :=
377 + 4 377
19 (4 + 377)
U3, 4 :=
377 + 4 377
19 (4 + 377)
U4, 3 :=
377 + 4 377
4 (4 + 377)
U4, 4 :=
377 + 4 377
1 0
0
0 1
0
4
(4
+
377)
0 0
377 + 4 377
19 (4 + 377)
0 0
377 + 4 377
1
3
377 (4 + 377)
A :=
0 9 (377 + 4 377)
0
0
0
0
19 (4 + 377)
377 + 4 377
4 (4 + 377)
377 + 4 377
0
377 (4 + 377)
9 (377 + 4 377)
2537 (4 + 377)2
9 (377 + 4 377)2
1122 (4 + 377)2
(377 + 4 377)2
0
0
1122 (4 + 377)2
(377 + 4 377)2
240
377
84
7 34 (4 + 377)
9 (4 + 377)
b := 0, ,
,
3 3 (377 + 4 377)
377 + 4 377
1 0
0
0
1
46
(4
+
377)
10
(4
+
377)
0
3 (377 + 4 377)
377 + 4 377
14 (4 + 377)
2
11 (4 + 377)
UD :=
0 3
3 (377 + 4 377)
377 + 4 377
34 (4 + 377)
9 (4 + 377)
3
3 (377 + 4 377)
377 + 4 377
"
0
80
377 (4 + 377)
lu :=
9 (377 + 4 377)
0
0
1 3
0 1
0 0
0 0
1
0
1
0
80
377 (4 + 377)
LL :=
9 (377 + 4 377)
0
0
1 3
0 1
UU :=
0 0
0 0
,
0
+
377
751 (377 + 4 377)2
0
6759 (4 + 377)2
80 (377 + 4 377)2
1122 (4 + 377)2
(377 + 4 377)2
29920
2253
1
0
377 (4 + 377)
80 (377 + 4 377)
6759 (4 + 377)2
80 (377 + 4 377)2
1122 (4 + 377)2
(377 + 4 377)2
0
377 (4 + 377)
80 (377 + 4 377)
1
0
aux 1 := 0
21
aux 2 :=
80
29920
2253
1
0
85
3 (377 + 4 377)
aux 3 :=
751 (4 + 377)
aux 4 :=
30160 (393 + 8 377)
rez 4 :=
30160 (393 + 8 377)
3 (377 + 4 377)
rez 3 :=
377 (4 + 377)
9
rez 2 :=
40
27
rez 1 :=
40
27 1 7 1
rez :=
, ,
,
40 5 40 16
<-- exit householder (now at top level) = x = 27/40, y = 1/5, z =
-7/40, t = -1/16}
27
1
7
1
x= ,y= ,z=
,t=
40
5
40
16
solve({x-y+2*z+2*t=0,-x+y+3*z=-1,2*x+3*y-z+2*t=2,2*x+2*z=1},
{x,y,z,t});
27
1
7
1
{x = , y = , z =
,t=
}
40
5
40
16
2.6
Metoda Jacobi
2.6.1
Breviar teoretic
0
0
0
a21 0
0
a
a
0
L=
31 32
an1 an2 an3
... 0
... 0
... 0
... 0
(2.26)
86
a11 0
0 ... 0
0 a22 0 . . . 0
D=
0 a33 . . . 0
0
0
0
0 . . . ann
0 a12 a13 . . .
a1n
0
0 a23 . . .
a2n
U =
.
0
0
0 . . . an1,n
0
0
0 ...
0
(2.27)
(2.28)
(2.29)
Folosind teorema de convergenta se studiaza daca traiectoria Jacobi converge la solutia x() a sistemului (2.25).
Traiectoria Jacobi converge la solutia x() a sistemului (2.25), daca si
numai daca raza spectrala a matricei
M = D 1 (L + U)
(2.30)
(2.31)
(k+1)
In caz de convergenta, componentele x(k+1)
, ..., xn
ale vectorului
1
(k+1)
(0)
x
, situat pe traiectoria Jacobi a vectorului x , sunt date de relatiile:
(k+1)
xi
n
X
1
(k)
= bi
aij xj
, i = 1, 2, . . . , n; k = 0, 1, . . .
aii
j=1
(2.32)
j6=i
2.6.2
Problem
a rezolvat
a
5x 2y + 3z = 1
3x + 9y + z = 2
2x y 7z = 3.
87
5 2
3
1
9
1 , b = 2 .
A = 3
2 1 7
3
Matricea A se descompune n suma
0
0 0
L = 3
0 0 , D=
2 1 0
L + D + U cu
5 0
0
0 2 3
0 9
0 , U = 0
0 1 .
0 0 7
0
0 0
Verificarea conditiei de convergenta a algoritmului presupune calculul valorilor proprii ale matricei
2 3
0 5
5
1
1
1
M = D (L + U) =
0
3
9
2 1
0
7 7
Calculand maximul n modul al valorilor proprii ale matricei M, obtinem
(M) = 0.2673998083 < 1,
si deci algoritmul converge.
Aplicam formulele (2.32), plecand de la x(0) = 0, y (0) = 0, z (0) = 0, obtinem
succesiv:
x(1) = 0.2000000000
y (1) = 0.2222222222
z (1) = 0.4285714286
x(2) = 0.1460317460
y (2) = 0.2031746032
z (2) = 0.5174603174
x(3) = 0.1917460316
y (3) = 0.3283950617
z (3) = 0.4158730159.
Pentru comparatie, am rezolvat acest sistem folosind procedura solve
furnizata de Maple, iar rezultatele sunt:
x = 0.1861198738, y = 0.3312302839, z = 0.4227129338.
88
2.6.3
Probleme propuse
x + y z = 2
2.6.4
Implementare
A. Algoritm
Observatia 2.6.1. Deoarece metoda lui Jacobi este o metoda iterativa, trebuie specificata o conditie de oprire a algoritmului. Algoritmul converge daca
sirul (x(k) ) este convergent. Convergenta acestui sir poate fi descrisa n mod
teoretic n diverse moduri. In practica, se foloseste o varianta a criteriului
lui Cauchy, si anume: sirul (x(k) ) este convergent, daca
kx(k+1) x(k) k <
unde este o constanta data.
In cazul nostru, vom considera ca solutiile sistemului au fost obtinute cu
eroarea , adica
(k+1)
()
()
xi
[xi , xi + ].
De aici rezulta o conditie de oprire a algoritmului:
v
u n
uX (k+1)
(k)
t (x
xi ) < n.
i
(2.33)
i=1
89
n
X
1
(k)
aij xj
, i = 1, n
= bi
aii
j=1
j6=i
v
u n
uX (k+1)
(k)
pana cand t (xi
xi ) < n
i=1
90
od;
od;
# conditia de convergenta
m:=multiply(inverse(d),matadd(l,u,-1,-1));
lst:=[eigenvals(m)];
if evalf(max(seq(abs(lst[k]),k=1..nops(lst))))>=1 then
ERROR(Algoritmul nu converge);
fi;
# algoritmul propriu-zis
for i from 1 to n do
xo[i]:=init[i]
od;
test:=1;
while test>=evalf(eps*sqrt(n)) do
for i from 1 to n do
x[i]:=evalf(
1/A[i,i]*( b[i]-sum(A[i,k]*xo[k],k=1..n)+A[i,i]*xo[i] )
);
od;
test:=evalf(sqrt( sum( (x[k]-xo[k])^2, k=1..n ) ));
for i from 1 to n do
xo[i]:=x[i];
od;
od;
RETURN(seq(var[i]=x[i],i=1..n));
end:
debug(jacobi):
jacobi({3*x+y=5, x+2*y=5}, vector(2,[0,0]),0.01);
{--> enter jacobi, args = {3*x+y = 5, x+2*y = 5}, array(1 ..
2,[(1)=0,(2)=0]), .1e-1
var := [x, y]
n := 2
3 1 5
AA :=
1 2 5
3 1
A :=
1 2
b := [5, 5]
91
0 0
0 0
0 0
0 0
0 0
0 0
d1, 1 := 3
u1, 2 := 1
l2, 1 := 1
d2, 2 := 2
1
0
3
m :=
1
0
2
6
6
lst := [
,
]
6
6
xo 1 := 0
xo 2 := 0
test := 1
x1 := 1.666666667
x2 := 2.500000000
test := 3.004626063
xo 1 := 1.666666667
xo 2 := 2.500000000
x1 := 0.8333333333
x2 := 1.666666666
test := 1.178511303
xo 1 := 0.8333333333
xo 2 := 1.666666666
x1 := 1.111111111
x2 := 2.083333334
test := 0.5007710115
xo 1 := 1.111111111
xo 2 := 2.083333334
x1 := 0.9722222220
x2 := 1.944444444
test := 0.1964185512
xo 1 := 0.9722222220
92
>
>
>
93
1.5
0.5
94
2.7
2.7.1
Metoda Gauss-Seidel
Breviar teoretic
(2.34)
(2.35)
(k+1)
xi
2.7.2
n
X
1
(k)
= b1
a1j xj
a11
j=2
i1
n
X
X
1
(k+1)
(k)
= bi
aij xj
aij xj
, i = 2, . . . , n.
aii
j=1
j=i+1
(2.36)
(2.37)
Problem
a rezolvat
a
Exercitiul 2.7.1. Sa se determine primele 3 puncte de pe traiectoria GaussSeidel a vectorului (0, 0)T pentru sistemul urmator:
4x + y = 1
4x + 3y = 2.
Rezolvare
Sistemul se poate scrie sub forma Ax = b, unde
4 1
1
A=
, b=
4 3
2
95
3
(M) =
<1
3
si deci algoritmul este convergent.
In continuare, aplicam formulele (2.36)-(2.37) si, plecand de la punctele x(0) =
0, y (0) = 0, obtinem:
x(1) = 0.2500000000
y (1) = 0.3333333333
x(2) = 0.1666666667
y (2) = 0.4444444443
x(3) = 0.1388888889
y (3) = 0.4814814813
2.7.3
Probleme propuse
x + y z = 2
96
2.7.4
Implementare
A. Algoritm
Observatia 2.7.1. Deoarece metoda Gauss-Seidel este o metoda iterativa,
trebuie specificata o conditie de oprire a algoritmului. In continuare vom
folosi aceeasi conditie de oprire a algoritmului ca si cea prezentata n paragraful 2.6.4:
v
u n
uX (k+1)
(k)
t (x
xi ) < n.
(2.38)
i
i=1
(k+1)
x1
(k+1)
xi
n
X
1
(k)
= b1
a1j xj
a11
j=2
i1
n
X
X
1
(k+1)
(k)
= bi
aij xj
aij xj
, i = 2, n.
aii
j=1
j=i+1
v
u n
uX (k+1)
(k)
pana cand t (xi
xi ) < n
i=1
97
98
od;
test:=evalf(sqrt( sum( (x[k]-xo[k])^2, k=1..n ) ));
for i from 1 to n do
xo[i]:=x[i];
od;
od;
RETURN(seq(var[i]=x[i],i=1..n));
end:
debug(gseidel):
gseidel({3*x+y=5, x+2*y=5}, vector(2,[0,0]),0.01);
{--> enter gseidel, args = {3*x+y = 5, x+2*y = 5}, array(1 ..
2,[(1)=0,(2)=0]), .1e-1
var := [x, y]
n := 2
3 1 5
AA :=
1 2 5
3 1
A :=
1 2
b := [5,
0
l :=
0
0
u :=
0
0
d :=
0
5]
0
0
0
0
0
0
d1, 1 := 3
u1, 2 := 1
l2, 1 := 1
d2, 2 := 2
1
0
3
m :=
1
0
6
99
1
]
6
xo 1 := 0
xo 2 := 0
test := 1
x1 := 1.666666667
x2 := 1.666666666
test := 2.357022604
xo 1 := 1.666666667
xo 2 := 1.666666666
x1 := 1.111111111
x2 := 1.944444444
test := 0.6211299943
xo 1 := 1.111111111
xo 2 := 1.944444444
x1 := 1.018518519
x2 := 1.990740740
test := 0.1035216650
xo 1 := 1.018518519
xo 2 := 1.990740740
x1 := 1.003086420
x2 := 1.998456790
test := 0.01725361142
xo 1 := 1.003086420
xo 2 := 1.998456790
x1 := 1.000514403
x2 := 1.999742798
test := 0.002875602202
xo 1 := 1.000514403
xo 2 := 1.999742798
lst := [0,
Comparativ, prezentam rezultatele obtinute cu ajutorul metodei GaussSeidel pentru acelasi sistem si vector initial al traiectoriei, dar pentru
diferite valori ale erorii:
>
>
100
>
2.8
2.8.1
Metoda relax
arii succesive
Breviar teoretic
(2.39)
(2.40)
se numeste traiectoria vectorului x(0) obtinuta prin relaxari succesive.
Traiectoria vectorului x(0) obtinuta prin relaxari succesive converge daca
si numai daca raza spectrala a matricei
1
1
1
1
D+U
(2.41)
L+ D
(k+1)
(k)
(k)
x1
= (1 ) x1 +
b1
a1j xj
(2.42)
a11
j=1
"
#
i1
n
X
X
(k+1)
(k)
(k+1)
(k)
xi
= (1 ) xi +
bi
aij xj
aij xj
, i = 2, . . . , n.
aii
j=1
j=i
(2.43)
2.8. METODA RELAXARII
SUCCESIVE
2.8.2
101
Problem
a rezolvat
a
Exercitiul 2.8.1. Sa se gaseasca primele 3 elemente ale traiectoriei vectorului (0, 0)T folosind metoda relaxarii succesive cu = 0.5, pentru sistemul:
4x + y = 1
4x + 3y = 2.
Rezolvare
Sistemul se poate scrie sub forma Ax = b, unde
4 1
1
A=
, b=
.
4 3
2
Matricea A se descompune n suma L + D + U, cu
0 0
4 0
0 1
L=
, D=
, U=
.
4 0
0 3
0 0
Algoritmul converge daca raza spectrala a matricei
1
M = L+ D
1
1
0.500 0.125
1
D+U =
0.333
0.583
x(2) = 0.1250000000
y (2) = 0.7500000000
x(3) = 0.0937500000
y (3) = 0.9166666667
102
2.8.3
Probleme propuse
Exercitiul 2.8.2. Sa se verifice daca se poate aplica metoda relaxarii succesive, si n caz afirmativ sa se gaseasca primele 3 elemente ale sirului de
solutii partiale, folosind o subrelaxare si o suprarelaxare. Comparati rezultatele
obtinute cu solutia exacta:
x + 3y = 2
a)
2x + y = 6
x + 2y + z = 1
b)
3x y + 5z = 14
x + y z = 2
2.8.4
Implementare
A. Algoritm
Observatia 2.8.2. Deoarece metoda relaxarii succesive este o metoda iterativa, trebuie specificata o conditie de oprire a algoritmului. Aceasta conditie
este similara cu cea folosita n paragrafele anterioare, si anume:
v
u n
uX (k+1)
(k)
t (x
xi ) < n.
(2.44)
i
i=1
si
0<<2
2.8. METODA RELAXARII
SUCCESIVE
103
(k+1)
x1
(k+1)
xi
(k)
= (1 ) x1 +
a11
"
+
aii
"
= (1 )
(k)
xi
b1
bi
n
X
j=1
i1
X
j=1
(k)
a1j xj
aij
(k+1)
xj
(2.45)
n
X
j=i
aij
(k)
xj
, i = 2, n
(2.46)
v
u n
uX (k+1)
(k)
xi ) < n
pana cand t (xi
i=1
104
2.8. METODA RELAXARII
SUCCESIVE
105
5]
0
0
0
0
0
0
d1, 1 := 3
u1, 2 := 1
l2, 1 := 1
d2, 2 := 2
m :=
0.009999999903 0.3300000001
0.004949999950 0.1733499999
106
>
>
>
>
>
>
>
0.99, 0.0001);
0.9, 0.0001);
1.01, 0.0001);
1.1, 0.0001);
0.7, 0.0001);
1.3, 0.0001);
1, 0.0001); #
Capitolul 3
Rezolvarea ecuatiilor si a
sistemelor de ecuatii neliniare
Fie sistemul neliniar
F (x) = 0
(3.1)
unde F (x) este vectorul (f1 (x), ..., fn (x))T , functiile f1 , ..., fn : D Rn R1
sunt considerate cunoscute, iar vectorul x = (x1 , ..., xn )T este necunoscut.
3.1
3.1.1
Solutiile sistemului neliniar (3.1) se cauta printre punctele fixe x() , adica
printre solutiile sistemului
G(x) = x
(3.2)
obtinut din sistemul initial prin alegerea
G(x) = x [F (x)]1 F (x)
(3.3)
unde F (x) este matricea Jacobi asociata vectorului F , matrice despre care
s-a presupus ca este continua si inversabila.
Presupunem ca operatorul G are un punct fix x() .
Definitia 3.1.1. Vom spune ca x() este un punct de atractie dac
a exist
a
()
n
()
o sfera deschisa S(x , r) = {x R | kx x k < r} cu urm
atoarele
proprietati:
1. S(x() , r) D si x(k) generat de
x(k+1) = G(x(k) )
107
(3.4)
x() .
Teorema 3.1.3. (Unicitatea punctului fix) Fie G : D Rn Rn un operator neliniar. Daca G este de clas
a C 1 pe D, si dac
a norma a matricei
Jacobi asociata operatorului G este strict subunitar
a ( < 1) pentru orice
x D, atunci pentru orice x0 sirul de aproximatii succesive
x(k+1) = G(xk ), k = 0, 1, 2, . . .
x(0) D
(3.5)
kAk = max
3.1.2
(3.6)
Problem
a rezolvat
a
x1 + x2 x2 = 0
8
109
x21 + x2 x1 + x22
,
6
8
T
, x = (x1 , x2 )T
G =
a carui norma este:
x1
3
1
8
1
6
x2
4
1 1
1 1
max
, |x2 | , , |x1 |
8 4
6 3
2
< 1, si
3
x1 = 0.1250000000
(1)
x2 = 0.0468750000
(2)
x1 = 0.0104166666
(2)
x2 = 0.0015767415
(3)
x1 = 0.0002808747
(3)
x2 = 0.0000354201
()
3.1.3
= 0,
Probleme propuse
3.1.4
Implementare
A. Algoritmi
Date de intrare: un sistem de ecuatii (dat ca multime de ecuatii), eqn,
un punct initial, x0 si o eroare
Date de iesire: solutia sistemului eqn obtinuta prin metoda punctului
fix, plecand de la punctul initial x0 , cu eroarea .
Algoritmul consta n urmatorii pasi:
1. generarea matricei G si verificarea conditiei ca norma matricei G sa fie
strict subunitara
2. gasirea solutiei aproximative
repeta
x(k+1) = G(xk )
(k+1)
(k)
xi | <
111
jac1:=[op(jac1),jacobian(g,x)[i,j]];
od;
od;
eig:=max(op(jac1));
WARNING(punctul de plecare trebuie ales astfel incat expresia
\%1 sa fie strict subunitara,eig);
yo:=x0;
test:=1; k:=1;
while test>=eps and k<50 do
for i from 1 to n do
test:=0;
y[i]:=evalf(subs(seq(x[k]=yo[k],k=1..n),g[i]));
if abs(y[i]-yo[i])>test then test:=abs(y[i]-yo[i]); fi;
yo[i]:=y[i];
if test>10^10 then ERROR(Algoritmul nu converge!);fi;
od;
k:=k+1;
od;
if k>=50 then
ERROR(sunt necesare mai mult de 50 de iteratii pentru gasirea
solutiei)
fi;
RETURN(seq(x[k]=y[k],k=1..n));
end:
debug(fixedpoint):
fixedpoint({(x^2+y)/6-x=0, (x+y^2)/8-y=0},vector(2,[0.5,0.5]),
0.0001);
{--> enter fixedpoint, args = {1/6*x^2+1/6*y-x = 0, 1/8*x+1/8*y^2-y =
0}, array(1 .. 2,[(1)=.5,(2)=.5]), .1e-3
n := 2
x := [x, y]
g := [0, 0]
x2 y
+
6
6
x y2
g2 := +
8
8
2
x
y x y2
+ , +
6
6 8
8
g1 :=
0 0
jac :=
0 0
x
jac 1, 1 :=
3
1
jac 1, 2 :=
6
1
jac 2, 1 :=
8
y
jac 2, 2 :=
4
jac1 := []
x
jac1 := [ ]
3
x 1
jac1 := [ , ]
3 6
x 1 1
jac1 := [ , , ]
3 6 8
x 1 1 y
jac1 := [ , , , ]
3 6 8 4
1 x y
eig := max( , , )
6 3 4
Warning, punctul de plecare trebuie ales astfel incat expresia
max(1/6,1/3*x,1/4*y) sa fie strict subunitara
yo := [0.5, 0.5]
test := 1
k := 1
test := 0
y1 := 0.1250000000
test := 0.3750000000
yo 1 := 0.1250000000
test := 0
y2 := 0.04687500000
test := 0.4531250000
yo 2 := 0.04687500000
k := 2
test := 0
y1 := 0.01041666667
test := 0.1145833333
yo 1 := 0.01041666667
test := 0
113
3.2
3.2.1
Solutia x() a sistemului neliniar (3.1) este data de limita sirului x(k) , unde:
x(k+1) = x(k) [F (x(k) )]1 F (x(k) ),
k = 0, 1, 2, . . .
(3.7)
k = 0, 1, 2, . . .
(3.8)
(3.9)
f (x(k) )
,
f (x(k) )
k = 0, 1, 2, . . .
(3.10)
3.2.2
(k)
=x
f (x(k) )
(0) ,
f (x )
k = 0, 1, 2, . . .
(3.11)
Probleme rezolvate
Exercitiul 3.2.1. Sa se gaseasca primii 3 termeni ai sirului de iteratii succesive (clasic si simplificat) al lui Newton, cu x(0) = (0.7, 0.4)T pentru sistemul:
2
x + y2 1 = 0
x3 y = 0.
Rezolvare
Sistemul se mai scrie F (x) = 0, unde
F (x) = (x2 + y 2 1, x3 y)T , x = (x, y)T .
Jacobianul operatorului F este:
F (x) =
2x 2y
3x2 1
115
[F (x)] F (x) =
(x2 + y 2 1)
y(x3 y) 3x(x2 + y 2 1) (x3 y)
+
,
T
117
0.05
0.15
0.2
0.15
0.2
0.0002
0.0004
0.0006
0.0008
0.001
0.0012
0.0002
0.0004
0.0006
0.0008
0.001
0.0012
3.2.3
Probleme propuse
x=0
x + y y = 0.
8
3.2.4
Implementare
A. Algoritmi
A1. Cazul n-dimensional
Date de intrare: un sistem de ecuatii eqn, un punct initial, x0 si o
eroare
Date de iesire: solutia aproximativa a sistemului, obtinuta folosind
metoda lui Nexton clasica, respectiv metoda lui Newton simplificata
Algoritmul consta n urmatorii pasi:
1. generarea functiei F
2. a) metoda lui Newton clasica
repeta
x(k+1) = x(k) [F (x(k) )]1 F (x(k) )
(k+1)
(k)
xi | <
(k)
xi | <
119
f (x(k) )
f (x(k) )
f (x(k) )
f (x(0) )
cnewton({x^2+y^2-1=0,x^3-y=0},vector(2,[0.7,0.4]),0.0001);
1. + 3. y x
1. + 3. y x
c := 1
test := 1.0
y0 1 := 0.7
jc0 1 := 0.1535714287
y1 := 0.8535714287
y0 2 := 0.4
jc0 2 := 0.1800885499
y2 := 0.5800885499
test := 0.1800885499
c := 2
y0 1 := 0.8535714287
jc0 1 := 0.02677208199
jc :=
121
cnewton1d(sin(xx)-xx=0, 0.2,0.001);
123
xx = 0.04796380022
125
Capitolul 4
Interpolare polinomial
a.
Functii spline
In practica este des ntalnita situatia n care se cunoaste valoarea unei functii
f n diferite puncte xi si se cere valoarea sa ntr-un punct intermediar. De exemplu, se poate cere valoarea temperaturii aerului la ora 14.30, cunoscanduse temperaturile aerului luate din ora n ora.
Astfel, se pune problema ca, plecand de la punctele date (xi , yi) sa se determine o functie de interpolare al carei grafic sa treaca prin toate punctele
date. Interpolarea se numeste polinomiala atunci cand se cauta functii polinomiale avand proprietatile mentionate.
4.1
4.1.1
f (xr+1 ) f (xr )
.
xr+1 xr
(4.1)
(D 1 f )(xr+1 ) (D 1 f )(xr )
[xr+1 , xr+2 , f ] [xr , xr+1 , f ]
=
xr+2 xr
xr+2 xr
(4.2)
127
FUNCT
128CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
Prin calcul se gaseste ca diferenta divizata de ordin k a lui f n xr este:
k
(D f )(xr ) =
k
X
i=0
f (xr+i )
k
Y
m=0
m6=i
(4.3)
(xr+i xr+m )
(4.5)
unde
Rm (x) =
f (m+1) ()
(x x0 )(x x1 ) . . . (x xm1 )(x xm )
(m + 1)!
(4.6)
(4.7)
(4.8)
(4.9)
(4.10)
m f (xm )
(D f )(xm ) =
.
m!hm
m
(4.11)
129
pm (x) =f (x0 ) +
4.1.2
Probleme rezolvate
Rezolvare
A. Polinomul lui Newton cu diferente divizate
1. Obtinerea diferentelor divizate:
FUNCT
130CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
x f (x)
1
D 1 f (x)
D 2 f (x)
D 3 f (x)
D 4 f (x)
10
17
26
52
=3
21
10 5
=5
32
17 10
=7
43
26 17
=9
54
53
=1
31
75
=1
42
97
=1
53
11
=0
41
11
=0
52
00
=0
51
[2, 3, 1, 0, 0].
x f (x)
1 f (x)
2 f (x)
3 f (x)
131
4 f (x)
52 =3
53=2 22= 0 00 =0
10 5 = 5
75=2 22=0
10
17 10 = 7 9 7 = 2
17
26 17 = 9
26
1 f (x)
2 f (x)
3 f (x)
4 f (x)
52 =3
10
10 5 = 5
53=2
17
17 10 = 7 7 5 = 2 2 2 = 0
26
26 17 = 9 9 7 = 2 2 2 = 0 0 0 = 0
FUNCT
132CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
Sirul diferentelor finite la stanga este sirul rezultatelor de pe ultima linie,
ncepand cu valorile functiei, adica:
[26, 9, 2, 0, 0].
2. Obtinerea polinomului de interpolare
9
2
0
P (x) =26 + (x 5) +
(x 5)(x 4) +
(x 5)(x 4)(x 3)+
2
1
2! 1
3! 13
0
+
(x 5)(x 4)(x 3)(x 2) =
4! 14
=26 + 9x 45 + x2 9x + 20 =
=x2 + 1.
4.1.3
Probleme propuse
2
x 2 3
2
b)
f (x) 1 0 1 0 1
4.1.4
Implementare
A. Algoritmi
Date de intrare: lista argumentelor x ale functiei, lista valorilor f x ale
functiei, si o variabila z
Date de iesire: valoarea polinomului de interpolare n acel numar, daca
z este un numar, respectiv expresia polinomului de interpolare, daca z este
o nedeterminata
Algoritm pentru diferente divizate
1. obtinerea diferentelor divizate
aux = f x
dif div = [f x1 ]
n = numarul de elemente ale listei x
naux = numarul de elemente ale listei aux
P = P (z xi ) + dif divi
pentru i de la n 1 la 1
P = P (z xi ) +
df di
(i 1)! hi1
auxk auxk1
,
xk+s1 xk1
133
k = 2, naux
FUNCT
134CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
1. obtinerea diferentelor finite la stanga
aux = f x
n = numarul de elemente ale listei aux
df s = [f xn ]
pentru k = 1, n 1
pentru i = 1, n k
pentru i = 1, k
df si
(i 1)! hi1
135
dd:=[op(dd), d1[1]];
aux:=d1;
od;
RETURN(dd);
end:
ddinterp:=proc(x::list, fx::list,xx)
local dd, pol, i;
if evalb(type(xx,numeric) and (xx<x[1] or xx>x[nops(x)])) then
WARNING (Polinomul de interpolare da rezultate corecte doar
pentru x in intervalul [%1,%2], x[1],x[nops(x)]);
fi;
dd:=difdiv(x,fx);
pol:=dd[nops(dd)];
for i from nops(dd)-1 by -1 to 1 do
pol:=pol*(xx-x[i])+dd[i];
od;
RETURN(simplify(pol));
end:
Testam acest program pentru calculul diferentelor divizate de la problema
rezolvata anterior.
x:=[1,2,3,4,5]: fx:=[2,5,10,17,26]: difdiv(x,fx);
[2, 3, 1, 0, 0]
Pentru calculul polinomului de interpolare, avem doua variante:
ddinterp(x,fx,10);
Warning, Polinomul de interpolare da rezultate corecte doar
pentru x in intervalul [1,5]
101
sau
ddinterp(x,fx,z);
z2 + 1
FUNCT
136CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
Observatia 4.1.1. Polinomul de interpolare da rezultate exacte pentru functii
polinomiale de grad maxim n, unde n este numarul de puncte n care se
cunoaste valoarea functiei cautate.
Observatia 4.1.2. Fie o functie tabelata, data prin lista ordonata a variabilelor [x1 = min, x2 , ..., xn = max], si lista valorilor sale [f1 , f2 , ..., fn ]. Polinomul de interpolare da rezultate apropiate de valoarea functiei doar pentru
x n intervalul [x1 , xn ]. Pentru a ilustra acest fapt, consideram functia sin x
pe intervalul [0, 2], si construim polinomul de interpolare cu diferente divizate. Pentru o vizualizare mai buna, am reprezentat grafic punctele de
interpolare, functia sin x si polinomul de interpolare.
Avem astfel:
x:=[0,Pi/2,Pi,3*Pi/2,2*Pi]: fx:=[0,1,0,-1,0]:
f:=ddinterp(x,fx,z);
p1:=plot(f, z=-2..8, color=red):
p2:=pointplot([seq([x[i],fx[i]],i=1..nops(x))], symbol=circle):
p3:=plot(sin(t), t=-2..8, color=green):
display(p1,p2,p3);
f :=
8(z 2 3z + 2 2 )z
3 3
z
4
137
diffind:=proc(x::list,fx::list)
local aux0,n,k,i,dif;
if nops(x)<>nops(fx) then
ERROR(primul si al doilea argument trebuie sa aibe acelasi
numar de elemente);
fi;
dif:=[fx[1]];
aux0:=fx;
n:=nops(aux0);
for k from n-1 by -1 to 1 do
for i from 1 to k do
aux0[i]:=aux0[i+1]-aux0[i];
od;
aux0:=subsop(n=NULL, aux0);
n:=n-1;
dif:=[op(dif),aux0[1]];
od;
end:
dfdinterp:=proc(x::list, fx::list, xx)
local dd, n, h, pol, i;
if evalb(type(xx,numeric) and (xx<x[1] or xx>x[nops(x)])) then
WARNING (Polinomul de interpolare da rezultate corecte doar
pentru x in intervalul [%1,%2], x[1],x[nops(x)]);
fi;
dd:=diffind(x,fx);
h:=x[2]-x[1];
n:=nops(dd);
pol:=dd[n]/((n-1)!*h^(n-1));
for i from n-1 by -1 to 1 do
pol:=pol*(xx-x[i])+dd[i]/((i-1)!*h^(i-1));
od;
RETURN(simplify(pol));
end:
diffins:=proc(x::list,fx::list)
local aux0,n,k,i,dif;
if nops(x)<>nops(fx) then
ERROR(primul si al doilea argument trebuie sa aibe acelasi
numar de elemente);
fi;
FUNCT
138CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
n:=nops(fx);
dif:=[fx[n]];
aux0:=fx;
for k from 1 to n-1 do
for i from 1 to n-k do
aux0[i]:=aux0[i+1]-aux0[i];
od;
aux0:=subsop(n-k+1=NULL,aux0);
dif:=[op(dif),aux0[n-k]];
od;
end:
dfsinterp:=proc(x::list, fx::list, xx)
local dd, n, h, pol, i;
if evalb(type(xx,numeric) and (xx<x[1] or xx>x[nops(x)])) then
WARNING (Polinomul de interpolare da rezultate corecte doar
pentru x in intervalul [%1,%2], x[1],x[nops(x)]);
fi;
dd:=diffins(x,fx);
h:=x[2]-x[1];
n:=nops(dd);
pol:=dd[n]/((n-1)!*h^(n-1));
for i from n-1 by -1 to 1 do
pol:=pol*(xx-x[i])+dd[i]/((i-1)!*h^(i-1));
od;
RETURN(simplify(pol));
end:
Testam aceste proceduri n cazul problemei rezolvate, si urmarim executia
procedurii diffind:
x:=[1,2,3,4,5]: fx:=[2,5,10,17,26]:
debug(diffind):
dd:=diffind(x,fx);
undebug(diffind):
dfd:=dfdinterp(x,fx,z);
ds:=diffins(x,fx);
dfs:=dfsinterp(x,fx,z);
>
diffind(x,fx);
{--> enter diffind, args = [1, 2, 3, 4, 5], [2, 5, 10, 17, 26]
139
dif := [2]
aux0 := [2, 5, 10, 17, 26]
n := 5
aux0 1 := 3
aux0 2 := 5
aux0 3 := 7
aux0 4 := 9
aux0 := [3, 5, 7, 9]
n := 4
dif := [2, 3]
aux0 1 := 2
aux0 2 := 2
aux0 3 := 2
aux0 := [2, 2, 2]
n := 3
dif := [2, 3, 2]
aux0 1 := 0
aux0 2 := 0
aux0 := [0, 0]
n := 2
dif := [2, 3, 2, 0]
aux0 1 := 0
aux0 := [0]
n := 1
dif := [2, 3, 2, 0, 0]
<-- exit diffind (now at top level) = [2, 3, 2, 0, 0]}
dd := [2, 3, 2, 0, 0]
df d := z 2 + 1
ds := [26, 9, 2, 0, 0]
df s := z 2 + 1
Observatia 4.1.3. Fie o functie tabelata, data prin lista ordonata a variabilelor, [x1 = min, x2 , ..., xn = max], si lista valorilor sale, [f1 , f2 , ..., fn ].
Polinomul de interpolare cu diferente finite nu aproximeaza bine functia,
pentru valori ale lui x n afara intervalului [x1 , xn ]. Un exemplu intuitiv n
acest sens l constituie urmatoarea secventa de program:
FUNCT
140CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
x:=[0,Pi/2,Pi,3*Pi/2,2*Pi]: fx:=[1,0,-1,0,1]:
f:=dfdinterp(x,fx,z);
g:=dfsinterp(x,fx,z);
p1d:=plot(f, z=-1.5..7.5, color=red):
p1s:=plot(f, z=-1.5..7.5, color=red):
p2:=pointplot([seq([x[i],fx[i]],i=1..nops(x))], symbol=circle):
p3:=plot(cos(t), t=-2..8, color=black, thickness=2):
display(p1d,p2,p3);
display(p1s,p2,p3);
f :=
8 z 4 32 z 3 + 34 z 2 2 4 z 3 3 4
3 4
g :=
8 z 4 16 z 3 + 10 z 2 2 8 z 3 3 4
3 4
2
0
z
4
141
z
4
4.2
4.2.1
Breviar teoretic
m
X
i=0
li (x) fi
(4.14)
unde
li (x) =
(4.15)
4.2.2
Probleme rezolvate
FUNCT
142CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
Polinoamele de interpolare Lagrange fundamentale sunt:
l0 (x) =
l1 (x) =
l2 (x) =
l3 (x) =
l4 (x) =
4.2.3
Probleme propuse
4.2.4
Implementare
A. Algoritm
Date de intrare: lista argumentelor functiei, x, lista valorilor functiei,
f x, si o variabila z
Date de iesire: valoarea polinomului de interpolare n acel numar, daca
z este un numar, respectiv expresia polinomului de interpolare, daca z este
o nedeterminata
Algoritm
n = numarul de elemente ale listei x
143
z xj
xi xj
1 + z2
Observatia 4.2.1. Polinomul de interpolare da rezultate exacte pentru functii polinomiale de grad maxim n, unde n este numarul de puncte n care se
cunoaste valoarea functiei cautate.
FUNCT
144CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
Observatia 4.2.2. Si n acest caz este valabila observatia ca, n general, polinomul de interpolare nu da rezultate corecte pentru valori ale parametrului
z situate n afara intervalului care contine argumentele functiei.
Observatia 4.2.3. Aspecte practice ale interpol
arii polinomiale:
1. Polinoamele Newton si Lagrange difera numai prin forma; restul este
acelasi n ambele cazuri, daca se considera aceeasi retea de noduri. Din
punct de vedere al calculului numeric, este preferata folosirea polinomului Newton deoarece acesta necesita un numar de operatii aritmetice
mai mic fata de polinomul Lagrange. Necesarul de memorie este acelasi
pentru ambii algoritmi.
2. Daca notam cu si cel mai mic, respectiv cel mai mare dintre nodurile
de interpolare, atunci din punct de vedere computational, sunt convenabile urmatoarele polinoame de interpolare: pentru x apropiat de
este convenabila utilizarea polinomului Newton cu diferente la dreapta
(forward); pentru x apropiat de este convenabila utilizarea polinomului Newton cu diferente la stanga (backward).
4.3
4.3.1
Interpolare spline
Breviar teoretic
(4.16)
145
(4.18)
Si (xi ) = Si+1
(xi ), i = 1, n 1.
(4.19)
(4.20)
Si (xi ) = Si+1
(xi ), i = 1, n 1;
(4.22)
S1 (x0 ) = Sn1
(xn1 ) = 0
(4.23)
S1 (x0 ) = y0 , Sn1
(xn1 ) = yn1
.
(4.24)
FUNCT
146CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
4.3.2
Probleme rezolvate
s10 + s11 (x 0)
s20 + s21 (x 2 )
S(x) =
s30 + s31 (x )
s40 + s41 (x 3
)
2
Notam:
S1
S2
S3
S4
,
,
,
,
x [0, 2 ]
x [ 2 , ]
x [, 3
]
2
3
x [ 2 , 2].
= s10 + s11 (x 0)
= s20 + s21 (x 2 )
= s30 + s31 (x )
= s40 + s41 (x 3
)
2
S2 ( ) = 1
2
S3 () = 0
3
S4 ( ) = 1
2
S4 (2) = 0
functia este continua
S1 ( ) = S2 ( )
2
2
S2 () = S3 ()
S3 (
3
3
) = S4 ( )
2
2
s10 = 0
s20 = 1
s30 = 0
s40 = 1
s41 =
s11 =
2
=
s21 =
s31
147
2 x + 2 , x [ 2 , ]
S(x) =
2 x + 2 , x [, 3
]
2
x4
, x [ 3
, 2].
1
0.5
1
0
0.5
s40 + s41 (x 3
) + s42 (x 3
)2
2
2
Notam:
S1
S2
S3
S4
,
,
,
,
x [0, 2 ]
x [ 2 , ]
x [, 3
]
2
x [ 3
,
2].
2
FUNCT
148CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
Conditiile care se pun sunt urmatoarele:
functia trece prin puncte
S1 (0) = 0
S2 ( ) = 1
2
S3 () = 0
3
S4 ( ) = 1
2
S4 (2) = 0
functia este continua
S1 ( ) = S2 ( )
2
2
S2 () = S3 ()
3
3
S3 ( ) = S4 ( )
2
2
derivata este continua
S1 ( ) = S2 ( )
2
2
S2 () = S3 ()
3
3
S3 ( ) = S4 ( )
2
2
conditie suplimentara
S1 (0) = 0
s10 = 0
s20 = 1
s30 = 0
s40 = 1
s11 = 0
1 + s41 2 + s42 ( 2 )2 = 0
s21 2 + s22 ( 2 )2 = 1
s31 2 + s32 ( 2 )2 = 1
2s12 2 s21 = 0
s12 ( 2 ) = 1
s + 2s22 2 s31 = 0
21
s31 + 2s32 2 s41 = 0
cu solutia
s12 =
4
12
12
4
4
8
4
, s22 = 2 s32 = 2 , s42 = 2 , s21 = , s31 = , s41 = .
2
149
2 x
x4
122 x2 + 16
S(x) =
12 2
x 32
x + 20
x 16
42 x2 + 16
[0, 2]:
, x [0, 2 ]
, x [ 2 , ]
, x [, 3
]
2
, x [ 3
, 2].
2
1
0.5
1
0
0.5
s40 + s41 (x 3
) + s42 (x 3
)2 + s43 (x 3
)3
2
2
2
,
,
,
,
x [0, 2 ]
x [ 2 , ]
x [, 3
]
2
x [ 3
,
2].
2
Notam:
S1
S2
S(x) =
S3
S4
FUNCT
150CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
Conditiile care se pun sunt urmatoarele:
functia trece prin puncte
S1 (0) = 0
S2 ( ) = 1
2
S3 () = 0
3
S4 ( ) = 1
2
S4 (2) = 0
functia este continua
S1 ( ) = S2 ( )
2
2
S2 () = S3 ()
3
3
S3 ( ) = S4 ( )
2
2
derivata este continua
S1 ( ) = S2 ( )
2
2
S2 () = S3 ()
3
3
S3 ( ) = S4 ( )
2
2
derivata a doua este continua
S1 ( ) = S2 ( )
2
2
S2 () = S3 ()
3
3
S3 ( ) = S4 ( )
2
2
conditii suplimentare
S1 (0) = 0
S4 (2) = 0
Solutia acestui sistem va fi:
s10 = 0
s11 =
s12 = 0
s20 = 1
s21 = 0
s22 =
4
3
4
= 3
s13 =
6
2
s23
151
s31 =
s40 = 1
s41 = 0
s32 = 0
s13 =
6
2
s42 =
4
3
s13 =
4
3
x(3 2 + 4x2 )
, x [0, 2 ]
3
2
2
3
( 12x + 9x + 4x )
, x [ 2 , ]
3
S(x) =
(x )( 2 + 4x2 8x)
]
, x [, 3
2
3
3
2
2
3
1.5
0.5
10
z
0.5
4.3.3
Probleme propuse
FUNCT
152CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
4.3.4
Implementare
A. Algoritmi
Prezentam n continuare algoritmul pentru obtinerea functiei spline cubice naturale.
Date de intrare lista argumentelor functiei, x, lista valorilor functiei,
f , si variabila z
Date de iesire daca z este numar, atunci returneaza valoarea functiei
spline n acel numar, daca z este simbol, atunci returneaza expresiile pe
subintervale ale functiei spline.
Algoritm
n = numarul de puncte, A - matrice patratica de ordinul n 2, b - vector
cu n 2 linii
pentru i = 1, n 1
hi = xi+1 xi
pentru i = 1, n 2
Ai,i = 2(hi + hi+1 )
pentru i = 2, n 2
Ai,i1 = hi
Ai1,i = hi
pentru i =1, n 2
fi+2 f i + 1 fi+1 fi
bi = 6
hi+1
hi
c1 = 0
cn = 0
pentru i = 2, n 1
ci = a i 1-a solutie a sistemului tridiagonal Ac = b
pentru i = 1, n 1
si0 = fi
fi+1 fi 2hi ci + hi ci+1
si1 =
hi
6
ci
si2 =
2
ci+1 ci
si3 =
6hi
B. Programe MAPLE si rezultate
Programul Maple pentru determinarea functiei spline cubice naturale este
urmatorul:
cubicspline:=proc(x::list, f::list, xx)
local n,i,h, A, b,c,aa,bb,cc,dd;
153
n:=nops(x);
A:=matrix(n-2, n-2, 0);
b:=vector(n-2);
for i from 1 to n-1 do
h[i]:=x[i+1]-x[i];
od;
for i from 1 to n-2 do
A[i,i]:=2*(h[i]+h[i+1]);
od;
for i from 2 to n-2 do
A[i,i-1]:=h[i];
A[i-1,i]:=h[i];
od;
for i from 1 to n-2 do
b[i]:=6*( (f[i+2]-f[i+1])/h[i+1] - (f[i+1]-f[i])/h[i] );
od;
c:=linsolve(A,b);
c:=[0,seq(c[i],i=1..n-2),0];
for i from 1 to n-1 do
aa[i]:=f[i];
bb[i]:=(f[i+1]-f[i])/h[i]-(2*c[i]*h[i]+c[i+1]*h[i])/6;
cc[i]:=c[i]/2;
dd[i]:=(c[i+1]-c[i])/(6*h[i]);
od;
if type(xx,numeric) then
if evalb(evalf(xx)<evalf(x[1]) or evalf(xx)>evalf(x[n])) then
WARNING(rezultatele interpolarii nu sunt exacte decat pentru
x in intervalul [%1,%2], x[1],x[n]) fi;
if (evalf(xx)<evalf(x[1])) then
RETURN(aa[1]+bb[1]*(xx-x[1])+cc[1]*(xx-x[1])^2+dd[1]*(xx-x[1])^3);
else
i:=1;
while evalb(evalf(x[i])<=evalf(xx) and i<n) do i:=i+1; od;
if i>=n then
RETURN(aa[n-1]+bb[n-1]*(xx-x[n-1])+cc[n-1]*(xx-x[n-1])^2+
dd[n-1]*(xx-x[n-1])^3);
else
i:=i-1;
fi;
RETURN(aa[i]+bb[i]*(xx-x[i])+cc[i]*(xx-x[i])^2+dd[i]*(xx-x[i])^3);
fi;
FUNCT
154CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
fi;
if type(xx, name) then
printf(Functia spline cubice care interpoleaza datele x=%a si
f(x)=%a este\n, x, f);
for i from 1 to n-1 do
printf( %a+%a*(%a-%a)+%a*(%a-%a)^2+%a*(%a-%a)^3 , pentru
%a in intervalul [%a,%a] \n, aa[i],bb[i],xx,x[i],cc[i],
xx,x[i],dd[i],xx,x[i],xx,x[i],x[i+1]);
od;
fi;
RETURN(seq(simplify(f[i]+bb[i]*(xx-x[i])+cc[i]*(xx-x[i])^2+
dd[i]*(xx-x[i])^3), i=1..n-1));
end:
Testam aceasta procedura pe exemplul rezolvat anterior.
x:=[0,Pi/2,Pi,3*Pi/2,2*Pi]: fx:=[0,1,0,-1,0]:
x1:=cubicspline(x,fx,10);
x2:=cubicspline(x,fx,3);
cubicspline(x,fx,z);
Warning, rezultatele interpolarii nu sunt exacte decat
pentru x in intervalul [0,2*Pi]
2
3
3
3
6 10
4 10
2
2
x1 := 1 +
2
3
2
3
6 3
4 3
2 +
2
x2 := 1 +
2
3
Functia spline cubice care interpoleaza datele
x=[0, 1/2*Pi, Pi, 3/2*Pi, 2*Pi] si f(x)=[0, 1, 0, -1, 0] este
0+3/Pi*(z-0)+0*(z-0)^2+-4/Pi^3*(z-0)^3 , pentru z in
intervalul [0,1/2*Pi]
1+0*(z-1/2*Pi)+-6/Pi^2*(z-1/2*Pi)^2+4/Pi^3*(z-1/2*Pi)^3 ,
pentru z in intervalul [1/2*Pi,Pi]
0+-3/Pi*(z-Pi)+0*(z-Pi)^2+4/Pi^3*(z-Pi)^3 , pentru z in
intervalul [Pi,3/2*Pi]
-1+0*(z-3/2*Pi)+6/Pi^2*(z-3/2*Pi)^2+-4/Pi^3*(z-3/2*Pi)^3 ,
pentru z in intervalul [3/2*Pi,2*Pi]
155
3
3
4.4
Polinoame Bernstein
4.4.1
Breviar teoretic
y(t) =
n
X
i=0
4.4.2
(4.26)
Cni
t (1 t)
ni
yi , t [0, 1].
Probleme rezolvate
5
X
5
X
i=0
i=0
FUNCT
156CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
4.4.3
Probleme propuse
4.4.4
Implementare
A. Algoritmi
Date de intrare o lista de puncte n plan, Pi (xi , yi ), i = 1, n
Date de iesire ecuatiile parametrice ale curbei Bezier determinata de
aceste puncte
Algoritm pentru i = 0, n
x = x + Cni ti (1 t)ni xi+1
bezier:=proc(pct::list([numeric,numeric]))
local n,i,x,y;
for i from 1 to nops(pct) do
if nops(pct[i])<>2 then
ERROR(argumentul trebuie sa fie o lista de puncte in
plan!)
fi;
od;
n:=nops(pct)-1;
x:=0;
y:=0;
for i from 0 to n do
x:=x+binomial(n,i)*(t^i)*((1-t)^(n-i))*pct[i+1][1];
y:=y+binomial(n,i)*(t^i)*((1-t)^(n-i))*pct[i+1][2];
od;
RETURN(x,y);
end:
Testam aceasta procedura pe exemplul rezolvat anterior.
157
pct:=[[0,0],[1,2],[2,1],[3,2],[2,4]];
bezier(pct);
with(plots):
p1:=pointplot(pct,symbol=circle):
p2:=plot([bezier(pct)[1],bezier(pct)[2], t=0..1], thickness=2):
display(p1, p2);
4t(1t)3 +12t2(1t)2 +12t3 (1t)+2t4, 8t(1t)3 +6t2 (1t)2 +8t3 (1t)+4t4
0.5
1.5
2.5
FUNCT
158CAPITOLUL 4. INTERPOLARE POLINOMIALA.
II SPLINE
Capitolul 5
Derivare numeric
a
Necesitatea derivarii numerice apare n practica n urmatoarele doua situatii:
a) expresia analitica a functiei date f conduce la o derivare formala dificila,
caz n care derivata se aproximeaza prin diferente finite;
b) expresia analitica a functiei f nu este cunoscuta (i.e. functia f este
data tabelat), caz n care derivata se aproximeaza prin derivata unui
polinom de interpolare
5.1
5.1.1
f (x + h) f (x) f ()
f (x) =
h, (x, x + h)
h
2
(5.1)
f (x) f (x h) f ()
f (x) =
+
h, (x h, x)
h
2
(5.2)
159
CAPITOLUL 5. DERIVARE NUMERICA
160
5.1.2
Probleme rezolvate
f (2 + 0.1) f (2)
= 7.1
0.1
f (2) =
f (2) f (2 0.1)
= 6.9,
0.1
respectiv
f (2 + 0.01) f (2)
= 7.01
0.01
f (2) =
f (2) f (2 0.01)
= 6.99,
0.01
respectiv
5.1.3
161
Probleme propuse
5.1.4
Implementare
A. Algoritmi
Date de intrare expresia unei functii, f , punctul x0 n care dorim sa
calculam derivata (respectiv a doua derivata) si precizia h cu care dorim sa
calculam aceasta derivata.
Date de iesire valoarea f (x0 ) calculata cu diferente finite la dreapta
(respectiv la stanga), respectiv valoarea lui f (x0 ) calculata cu diferente
finite la dreapta
Algoritm
a) derivata ntai cu diferente finite la dreapta:
f (x) =
f (x + h) f (x)
h
f (x) f (x h)
h
f (x + h) 2f (x) + f (x h)
h2
162
derivst:=proc(f::algebraic,x::numeric,h::float)
local xx;
xx:=op(indets(f, name));
simplify((subs(xx=x,f)-subs(xx=x-h,f))/h);
end:
derivdoi:=proc(f::algebraic,x,h::float)
local xx;
xx:=op(indets(f, name));
simplify((subs(xx=x+h,f)-2*subs(xx=x,f)+subs(xx=x-h,f))/h^2);
end:
derivdoi:=proc(f::algebraic,x,h::float)
local xx;
xx:=op(indets(f, name));
simplify((subs(xx=x+h,f)-2*subs(xx=x,f)+subs(xx=x-h,f))/h^2);
end:
Testam aceste programe astfel:
derivdr(x^2+3*x+2,2,0.1);
derivst(x^2+3*x+2,2,0.1);
derivdr(x^2+3*x+2,2,0.01);
derivst(x^2+3*x+2,2,0.01);
derivdr(x^2+3*x+2,2,0.00001);
derivst(x^2+3*x+2,2,0.00001);
derivdoi(x^3+5*x^2+1,x,0.01);
derivdr(sin(x),0,0.001);
7.100000000
6.900000000
7.010000000
6.990000000
7.
6.
6.x + 10.
0.9999998333
5.2
5.2.1
163
5.2.2
Probleme rezolvate
CAPITOLUL 5. DERIVARE NUMERICA
164
5.2.3
Probleme propuse
5.2.4
Implementare
A. Algoritmi
Functia de interpolare a functiei tabelate f se obtine folosind unul din
algoritmii prezentati n sectiunile 4.2, 4.1 sau 4.3. Derivata functiei de interpolare se obtine n Maple folosind procedura diff.
B. Programe MAPLE si rezultate
Exemplificam aplicarea acestei metode pentru functia tabelata
x
1 2
3 4 5
f (x) 1 3 1 0 1
folosind polinomul de interpolare Lagrange.
>
>
>
>
>
Capitolul 6
Integrare numeric
a
Fie f : [a, b] R o functie integrabila Riemann-Darboux si nodurile echidisba
tante xi = a + ih ale intervalului [a, b], i = 0, N, h =
.
N
6.1
6.1.1
f (x)dx
h
ba
[f (b) + f (a)] = [f (b) + f (a)].
2
2
(6.1)
Formula general
a a trapezelor (formula trapezelor aplicata pe n subintervale ale intervalului dat):
Z
"
#
n1
X
h
f (x)dx f (a) + 2
f (xi ) + f (b) .
2
i=1
b
a
(6.2)
f (x)dx
h
[f (a) + 4f (a + h) + f (b)].
3
(6.3)
CAPITOLUL 6. INTEGRARE NUMERICA
166
6.1.2
Probleme rezolvate
x3 + 1 dx
folosind:
a) metoda clasica (formala);
b) formula trapezelor;
c) formula generala a trapezelor mpartind intervalul [0, 1] n 2, 4, 8 subintervale;
d) formula lui Simpson.
Rezolvare
Rezultatul exact, obtinut prin metoda formala, este:
Z 1
4 1
x
+ x|10 = 1 + 1 = 5 = 1.25.
x3 + 1 dx =
4 0
4
4
0
1
65
9
91
81
= (1 + 2 + 2 + 2 + 2) =
= 1.265625.
8
64
8
64
64
167
6.1.3
Probleme propuse
Exercitiul 6.1.2. Sa se calculeze integralele urmatoare folosind formula generala Za trapezelor pentru n = 4 subintervale si formula lui Simpson:
8
x3 + 1 dx
a)
b)
c)
Z0 1
Z 02
cos x dx
3x2 + 1 dx
6.1.4
Implementare
A. Algoritmi
Algoritmii folositi pentru integrarea numerica se bazeaza pe formulele de
integrare prezentate anterior.
B. Programe MAPLE si rezultate
trapeze:=proc(f::algebraic, ab::range,N::numeric)
local i, a, b, h, xx;
a:=lhs(ab);
b:=rhs(ab);
h:=(b-a)/N;
xx:=op(indets(f, name));
evalf( h/2*( subs(xx=a, f) + 2*sum(subs(xx=a+i*h,f), i=1..N-1) +
subs(xx=b,f)
)
);
end:
CAPITOLUL 6. INTEGRARE NUMERICA
168
simpson:=proc(f::algebraic, ab::range)
local i, a, b, xx;
a:=lhs(ab);
b:=rhs(ab);
xx:=op(indets(f, name));
evalf( (b-a)/6*( subs(xx=a,f) + 4*subs(xx=a+(b-a)/2,f) +
subs(xx=b,f)
)
);
end:
Exemplificam n continuare calculul integralei
Z
sin x + 1 dx.
>
f:=x->sin(x)+1;
f := x sin(x) + 1
>
evalf(int(f(x),x=0..1));
1.459697694
>
trapeze(f(x),0,1,1);
1.420735492
>
trapeze(f(x),0,1,2);
1.450080515
>
trapeze(f(x),0,1,4);
1.457300938
>
trapeze(f(x),0,1,8);
1.459098974
>
simpson(f(x),0,1);
1.459862190
6.2
6.2.1
f (x)dx f
!
3
+f
3
!
3
.
3
(6.4)
169
5
f (x)dx f
9
1
15
8
5
+ f (0) + f
9
9
15
5
(6.5)
!
18 30
525 + 70 30
f (x)dx
f
+
36
35
1
p
!
18 + 30
525 70 30
+
f
+
36
35
p
!
18 + 30
525 70 30
+
f
+
36
35
p
!
18 30
525 + 70 30
f
.
+
36
35
(6.6)
Deoarece n formulele de integrare numerica de tip Gauss limitele de interpolare sunt -1 si 1, n cazul n care dorim sa integram o functie definita
pe un interval [a, b], facem schimbarea de variabila
x=
(b a)t + b + a
2
(6.7)
care va transforma intervalul [a, b] al variabilei x n intervalul [0, 1] corespunzator noii variabile t. Astfel, se obtine:
Z
b
a
ba
f (x)dx =
2
f
1
(b a)t + a + b
2
dt.
(6.8)
Observatia 6.2.1. Spre deosebire de formulele de integrare de tip NewtonCotes, care sunt exacte pentru polinoame de grad maxim 2N 1, formulele de
integrare de tip Gauss sunt exacte pentru polinoame de grad maxim 2N + 1.
6.2.2
Probleme rezolvate
1
2
x + 1 dx si
1
2
0
x3 1 dx folosind o
CAPITOLUL 6. INTEGRARE NUMERICA
170
Rezolvare
Folosim formula pentru 2 puncte, care da rezultate exacte pentru polinoame pana la gradul 5. Avem:
!2
!2
Z 1
3
3
8
x2 + 1 dx =
+1+
+1=
3
3
3
1
Z
6.2.3
2
0
x3 1 dx =
+1
3
!3
1+
3
+1
3
!3
1 = 2.
Probleme propuse
x3 + 1 dx
a)
b)
c)
Z0 1
Z 02
cos x dx
3x2 + 1 dx
6.2.4
Implementare
A. Algoritmi
Algoritmii folositi pentru integrarea numerica se bazeaza pe formulele de
integrare prezentate anterior.
B. Programe MAPLE si rezultate
Urmatorul program MAPLE ia ca argument o functie f , capetele intervalului pe care se integreaza, a si b, si ordinul n (care poate fi 2, 3 sau 4).
gauss:=proc(f::algebraic, ab::range, n::numeric)
local xx, a, b g;
xx:=op(indets(f, name));
a:=lhs(ab);
b:=rhs(ab);
g:=subs(xx=(2*yy-a-b)/(b-a), f);
if n=2 then
evalf( (b-a)/2*(subs(yy=-1/3*sqrt(3),g) +
>
>
>
>
>
gauss(x^8+1, 0..2,4);
58.87727878
evalf(int(x^8+1, x=0..2));
58.88888889
f:=x->sin(x)+1;
f := x sin(x) + 1
gauss(f(x),0..1,2);
0.6598837714
gauss(f(x),0..1,3);
0.6159146322
gauss(f(x),0..1,4);
1.234908772
171
172
Capitolul 7
Ecuatii diferentiale
Vom prezenta n continuare metode numerice de rezolvare a problemelor cu
date initiale pentru ecuatii diferentiale de ordinul ntai, precum si metode numerice de rezolvare a unor probleme la limita liniare pentru ecuatii diferentiale
de ordinul al doilea.
y
= f (x, y)
y(x0 ) = y0
(7.1)
(7.2)
174
7.1
7.1.1
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
(7.3)
(7.4)
(7.5)
7.1.2
Probleme rezolvate
y1 = 2.100000000
y2 = 2.201000000
y3 = 2.305000000
y4 = 2.414000000
y5 = 2.530000000
y6 = 2.655000000
y7 = 2.791000000
y8 = 2.940000000
y9 = 3.104000000
y10 = 3.285000000
175
x3
+ x + 2.
3
3.2
3
2.8
2.6
2.4
2.2
2
0
7.1.3
0.2
0.4
0.6
0.8
Probleme propuse
7.1.4
Implementare
A. Algoritmi
Date de intrare: o ecuatie y (x) = f (x, y(x)), valorile initiale x0 si y0 ,
un interval [a, b] si numarul de puncte n care se mparte intervalul, N
Date de iesire: solutia aproximativa a problemei cu date initiale, data
sub forma unui sir de puncte, rez, folosind metoda lui Euler cu diferente
finite nainte
Algoritmul consta n urmatorii pasi:
176
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
1. definirea functiei f
2. aplicarea formulei lui Euler cu diferente finite nainte:
adauga elementul (x0 , y0) la lista rez
pentru i = 0, N 1
yi+1 = yi + h f (xi , yi )
xi+1 = xi + h
adauga punctul (xi+1 , yi+1) la liste rez
dfieuler(diff(f(x),x)=x^2+1,0,2,0..1,10);
177
178
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
rez := [[0, 2], [0.1000000000, 2.100000000], [0.2000000000, 2.201000000],
[0.3000000000, 2.305000000], [0.4000000000, 2.414000000],
[0.5000000000, 2.530000000], [0.6000000000, 2.655000000],
[0.7000000000, 2.791000000]]
y1 := 2.940000000
x1 := 0.8000000000
rez := [[0, 2], [0.1000000000, 2.100000000], [0.2000000000, 2.201000000],
[0.3000000000, 2.305000000], [0.4000000000, 2.414000000],
[0.5000000000, 2.530000000], [0.6000000000, 2.655000000],
[0.7000000000, 2.791000000], [0.8000000000, 2.940000000]]
y1 := 3.104000000
x1 := 0.9000000000
rez := [[0, 2], [0.1000000000, 2.100000000], [0.2000000000, 2.201000000],
[0.3000000000, 2.305000000], [0.4000000000, 2.414000000],
[0.5000000000, 2.530000000], [0.6000000000, 2.655000000],
[0.7000000000, 2.791000000], [0.8000000000, 2.940000000],
[0.9000000000, 3.104000000]]
y1 := 3.285000000
x1 := 1.000000000
179
cos x
y(x)
y(0) = 2
y (x) =
>
>
dsolve({diff(f(x),x)=cos(x)/f(x),f(0)=2},f(x));
p
f(x) = 2 sin(x) + 4
p1:=plot([seq(dfieuler(diff(f(x),x)=cos(x)/f,0,2,0..5,N),N=2..52,10)]
):
>
>
display(p1,p2);
3.2
3
2.8
2.6
2.4
2.2
2
1.8
1.6
1.4
0
7.2
7.2.1
Y0
= y(x0 )
Yi+1 = Yi + h Tn (xi , Yi , h) pentru i = 0, 1, . . . , N 1,
(7.6)
180
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
iar
Tn (xi , yi, h) = f (xi , yi ) +
h
hn1 (n1)
f (xi , yi) + . . . +
f
(xi , yi ).
2!
n!
(7.7)
(7.8)
7.2.2
(7.9)
Probleme rezolvate
y (x) = 1 + x2
y(0) = 2
h
2x.
2
181
7.2.3
y1 = 2.120000000
y2 = 2.232706000
y3 = 2.350316071
y4 = 2.475125294
y5 = 2.609481021
y6 = 2.755790277
y7 = 2.916529651
y8 = 3.094257797
y9 = 3.291630711
y10 = 3.511419969
Probleme propuse
7.2.4
Implementare
A. Algoritmi
Date de intrare: o ecuatie y (x) = f (x, y(x)), valorile initiale x0 si y0 ,
un interval [a, b] si numarul de puncte n care se mparte intervalul, N
Date de iesire: solutia aproximativa a problemei cu date initiale, data
sub forma unui sir de puncte, rez
Algoritmul consta n urmatorii pasi:
1. definirea functiei f
2. aplicarea formulei lui Taylor de ordinul 2 sau 3:
adauga elementul (x0 , y0 ) la lista rez
pentru i = 0, N 1
182
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
yi+1 = yi + h T (xi , yi , h), unde T este dat de (7.8) sau (7.9)
xi+1 = xi + h
adauga punctul (xi+1 , yi+1) la liste rez
183
end:
taylor3:=proc(eq::equation, x0::numeric, y0::numeric,ab::range,
N::integer)
local h,f,varx,fx,fy,fxx,fxy,fyy,y1,x1,i,rez;
if StringTools[Has](convert(lhs(eq),string),"diff") then
f:=rhs(eq);
elif StringTools[Has](convert(rhs(eq),string),"diff") then
f:=lhs(eq);
else
ERROR (ecuatia trebuie sa fie de tipul diff(y(x),x)=f(x,y));
fi;
varx:=[op(indets(eq, name))];
if nops(varx)=1 then varx:=[op(varx),0]; fi;
fx:=diff(f,x);
fy:=diff(f,y);
fxx:=diff(f,x,x);
fxy:=diff(f,x,y);
fyy:=diff(f,y,y);
h:=(rhs(ab)-lhs(ab))/N;
y1:=y0;
x1:=x0;
rez:=[[x1,y1]];
for i from 1 to N do
y1:=evalf(
y1+
h*(
subs(varx[1]=x1,varx[2]=y1,f) +
h/2*(
subs(varx[1]=x1,varx[2]=y1,fx) +
subs(varx[1]=x1,varx[2]=y1,fy) *
subs(varx[1]=x1,varx[2]=y1,f)
) +
h^2/6*(
subs(varx[1]=x1,varx[2]=y1,fxx) +
2*subs(varx[1]=x1,varx[2]=y1,f) *
subs(varx[1]=x1,varx[2]=y1,fxy) +
subs(varx[1]=x1,varx[2]=y1,f)^2 *
subs(varx[1]=x1,varx[2]=y1,fyy) +
subs(varx[1]=x1,varx[2]=y1,fx) *
subs(varx[1]=x1,varx[2]=y1,fy) +
184
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
subs(varx[1]=x1,varx[2]=y1,f) *
subs(varx[1]=x1,varx[2]=y1,fy)^2
)
)
);
x1:=evalf(x1+h);
rez:=[op(rez),[x1,y1]];
od;
RETURN(rez);
end:
with(plots):
p1:=plot([taylor2(diff(f(x),x)=x^2+1,0,2,0..1,2),
taylor3(diff(f(x),x)=x^2+1,0,2,0..1,2)], 0..1):
p2:=plot(1/3*x^3+x+2, x=0..1,color=black, thickness=2):
display(p1,p2);
5
4.5
4
3.5
3
2.5
2
0
0.2
0.4
0.6
0.8
185
3.5
2.5
2
0
0.2
0.4
0.6
0.8
0.2
0.4
0.6
0.8
5
4.5
4
3.5
3
2.5
2
7.3
7.3.1
Metoda Runge-Kutta
Breviar teoretic
Metoda Runge-Kutta de ordinul n pentru rezolvarea problemei cu date initiale (7.1) presupune gasirea sirului (Yn )n care aproximeaza solutia problemei
date.
Pentru n = 2, obtinem:
Yi+1 = Yi +
h
[f (xi , Yi ) + f (xi+1 , Yi + hf (xi , Yi ))]
2
(7.10)
186
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
cu Y0 = y(x0 ).
Pentru n = 3, obtinem
Yi+1 = Yi +
1
(k1 + 4k2 + k3 )
6
(7.11)
cu Y0 = y(x0) si
k1 = h f (xi , Yi)
h
k1
k2 = h f xi + , Yi +
2
2
k3 = h f (xi + h, Yi k1 + 2k2)
(7.12)
Pentru n = 4, obtinem
Yi+1 = Yi +
1
(k1 + 2k2 + 2k3 + k4 )
6
(7.13)
cu Y0 = y(x0 ) si
k1 = h f (xi , Yi )
h
k1
k2 = h f xi + , Yi +
2
2
h
k2
k3 = h f xi + , Yi +
2
2
k4 = h f (xi + h, Yi + k3 )
7.3.2
(7.14)
Probleme rezolvate
y (x) = 1 + x2
y(0) = 2
pe intervalul [0, 1], folosind una din metodele Runge-Kutta prezentate mai
sus, pentru h = 0.1.
Rezolvare
Folosim metoda Runge-Kutta de ordinul 2.
187
7.3.3
y1 = 2.100500000
y2 = 2.203000000
y3 = 2.309500000
y4 = 2.422000000
y5 = 2.542500000
y6 = 2.673000000
y7 = 2.815500000
y8 = 2.972000000
y9 = 3.144500000
y10 = 3.335000000.
Probleme propuse
7.3.4
Implementare
A. Algoritmi
Date de intrare: o ecuatie y (x) = f (x, y(x)), valorile initiale x0 si y0 ,
un interval [a, b] si numarul de puncte n care se mparte intervalul, N
Date de iesire: solutia aproximativa a problemei cu date initiale, data
sub forma unui sir de puncte, rez, obtinuta cu metoda Runge-Kutta
Algoritmul consta n urmatorii pasi:
1. definirea functiei f
2. a) metoda Runge-Kutta de ordinul 2:
adauga elementul (x0 , y0 ) la lista rez
pentru i = 0, N 1
h
yi+1 = yi + [f (xi , yi) + f (xi+1 , yi + hf (xi , yi))]
2
188
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
xi+1 = xi + h
adauga punctul (xi+1 , yi+1) la liste rez
b) metoda Runge-Kutta de ordinul 3
adauga elementul (x0 , y0) la lista rez
pentru i = 0, N 1
189
subs(varx[1]=x1+h,
varx[2]=y1+h*subs(varx[1]=x1,varx[2]=y1,f), f)
));
x1:=evalf(x1+h);
rez:=[op(rez),[x1,y1]];
od;
RETURN(rez);
end:
rungekutta3:=proc(eq::equation, x0::numeric, y0::numeric,
ab::range, N::integer)
local f,varx,h,rez,x1,y1,i,k1,k2,k3;
if StringTools[Has](convert(lhs(eq),string),"diff") then
f:=rhs(eq);
elif StringTools[Has](convert(rhs(eq),string),"diff") then
f:=lhs(eq);
else
ERROR (ecuatia trebuie sa fie de tipul diff(y(x),x)=f(x,y));
fi;
varx:=[op(indets(eq, name))];
if nops(varx)=1 then varx:=[op(varx),0]; fi;
h:=(rhs(ab)-lhs(ab))/N;
rez:=[[x0,y0]];
x1:=x0; y1:=y0;
for i from 1 to N do
k1:=h*subs(varx[1]=x1,varx[2]=y1,f);
k2:=h*subs(varx[1]=x1+h/2,varx[2]=y1+k1/2,f);
k3:=h*subs(varx[1]=x1+h,varx[2]=y1-k1+2*k2,f);
y1:=evalf(y1 + 1/6*(k1+4*k2+k3));
x1:=evalf(x1+h);
rez:=[op(rez),[x1,y1]];
od;
RETURN(rez);
end:
rungekutta4:=proc(eq::equation, x0::numeric, y0::numeric,
ab::range, N::integer)
local f,varx,h,rez,x1,y1,i,k1,k2,k3,k4;
if StringTools[Has](convert(lhs(eq),string),"diff") then
f:=rhs(eq);
elif StringTools[Has](convert(rhs(eq),string),"diff") then
190
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
f:=lhs(eq);
else
ERROR (ecuatia trebuie sa fie de tipul diff(y(x),x)=f(x,y));
fi;
varx:=[op(indets(eq, name))];
if nops(varx)=1 then varx:=[op(varx),0]; fi;
h:=(rhs(ab)-lhs(ab))/N;
rez:=[[x0,y0]];
x1:=x0; y1:=y0;
for i from 1 to N do
k1:=h*subs(varx[1]=x1,varx[2]=y1,f);
k2:=h*subs(varx[1]=x1+h/2,varx[2]=y1+k1/2,f);
k3:=h*subs(varx[1]=x1+h/2,varx[2]=y1+k2/2,f);
k4:=h*subs(varx[1]=x1+h,varx[2]=y1+k3,f);
y1:=evalf(y1 + 1/6*(k1+2*k2+2*k3+k4));
x1:=evalf(x1+h);
rez:=[op(rez),[x1,y1]];
od;
RETURN(rez);
end:
>
rungekutta2(diff(f(x),x)=x^2+1,1,2,0..1,3);
>
>
191
3
2.5
2
1.5
1
0.5
0
7.4
7.4.1
Metoda Adams-Bashforth
Breviar teoretic
h
[3 f (xi , yi) f (xi1 , yi1 )]
2
(7.15)
h
{23 f (xi, yi) 16 f (xi1 , yi1) + 5 f (xi2 , yi2 )}.
12
(7.16)
unde y0 = y(x0 ). Pentru ca relatia (7.16) sa aibe sens, trebuie ca indicii sa fie
toti pozitivi, deci i 2. Valorile y1 si y2 trebuie calculate prin alta metoda
(de exemplu, folosind metoda lui Euler cu diferente finite nainte).
192
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
h
{1901 f (xi, yi) 2774 f (xi1, yi1 ) + 2616 f (xi2, yi2 )
720
(7.18)
7.4.2
Probleme rezolvate
y (x) = 1 + x2
y(0) = 2
Rezolvare
Folosim metoda Adams-Bashforth de ordinul 2.
Avem x0 = 0 si y0 = 2. Cu ajutorul formulei lui Euler cu diferente finite
nainte, obtinem x1 = 0.1000000000 si y1 = 2.100000000
193
7.4.3
y2 = 2.201500000
y3 = 2.307000000
y4 = 2.418500000
y5 = 2.538000000
y6 = 2.667500000
y7 = 2.809000000
y8 = 2.964500000
y9 = 3.136000000
y10 = 3.325500000.
Probleme propuse
7.4.4
Implementare
A. Algoritmi
Date de intrare: o ecuatie y (x) = f (x, y(x)), valorile initiale x0 si y0 ,
un interval [a, b], ordinul metodei, m, si numarul N de puncte n care se
mparte intervalul
Date de iesire: solutia aproximativa a problemei cu date initiale, data
sub forma unui sir de puncte, rez, obtinuta cu ajutorul metodei AdamsBashforth
Algoritmul consta n urmatorii pasi:
1. identificarea functiei f
ba
h=
N
2. gasirea solutiei aproximative
adauga elementul (x0 , y0 ) la lista rez
pentru i = 1, m 1
194
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
yi+1 = yi + h f (xi , yi )
xi+1 = xi + h
adauga punctul (xi+1 , yi+1) la lista rez
pentru i = m, N
obtine yi+1 din formula corespunzatoare ordinului((7.15), (7.16),
(7.17) sau (7.18))
xi+1 = xi + h
adauga punctul (xi+1 , yi+1) la lista rez
195
196
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
for i from 5 to N do
y1:=evalf(
y1+h/720*( 1901*subs(varx[1]=rez[nops(rez)][1],
varx[2]=rez[nops(rez)][2],f) 2774*subs(varx[1]=rez[nops(rez)-1][1],
varx[2]=rez[nops(rez)-1][2],f) +
2616*subs(varx[1]=rez[nops(rez)-2][1],
varx[2]=rez[nops(rez)-2][2],f) 1274*subs(varx[1]=rez[nops(rez)-3][1],
varx[2]=rez[nops(rez)-3][2],f) +
251*subs(varx[1]=rez[nops(rez)-4][1],
varx[2]=rez[nops(rez)-4][2],f)
));
x1:=x1+h;
rez:=[op(rez),[x1,y1]];
od;
fi;
else
ERROR(ordinul metodei Adams-Bashforth poate fi 2, 3 sau 4
sau 5);
fi;
RETURN(rez);
end:
In continuareprezentam pe acelasi sistem de coordonate solutia exacta a
problemei rezolvate anterior si solutiile obtinute cu metoda Adams-Bashforth,
n care am variat ordinul metodei dar am pastrat constant numarul de puncte
n care s-a calculat solutia.
with(plots):
p0:=plot(1/3*x^3+x+2, x=0..1,color=black, thickness=2):
p1:=plot([
adamsbashforth(diff(f(x),x)=x^2+1,0,2,0..1,2,6),
adamsbashforth(diff(f(x),x)=x^2+1,0,2,0..1,3,6),
adamsbashforth(diff(f(x),x)=x^2+1,0,2,0..1,4,6),
adamsbashforth(diff(f(x),x)=x^2+1,0,2,0..1,5,6)
]):
display(p0,p1);
197
3.2
3
2.8
2.6
2.4
2.2
2
0
7.5
0.2
0.4
0.6
0.8
Metoda Adams-Moulton
7.5.1
Breviar teoretic
h
[f (xi , yi) + f (xi+1 , yi+1)].
2
(7.19)
h
[5 f (xi+1 , yi+1 ) + 8 f (xi, yi ) f (xi1 , yi1 )].
12
(7.20)
Yi+1 = Yi +
h
[251 f (xi+1, Yi+1 ) + 646 f (xi, Yi ) 264 f (xi1 , Yi1)+
720
(7.22)
198
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
7.6
7.6.1
Metoda predictor-corector
Breviar teoretic
h
(p)
24
(7.23)
h
(p)
y
=
y
+
[9 f (xi+1, yi+1 ) + 19 f (xi , yi)
i+1
i
24
7.6.2
Probleme rezolvate
199
y1 = 2.100000000
y2 = 2.201000000
y3 = 2.305000000
7.6.3
y4p = 2.417333333
y4 = 2.417333333
y5p = 2.537666666
y5 = 2.537666666
y6p = 2.667999999
y6 = 2.667999999
y7p = 2.810333332
y7 = 2.810333332
y8p = 2.966666665
y8 = 2.966666665
y9p = 3.138999998
y9 = 3.138999998
p
y10
= 3.329333331
y10 = 3.329333331.
Probleme propuse
7.6.4
Implementare
A. Algoritmi
Date de intrare: o ecuatie y (x) = f (x, y(x)), valorile initiale x0 si y0 ,
un interval [a, b] si numarul de puncte N n care se mparte intervalul
Date de iesire: solutia aproximativa a problemei cu date initiale, data
sub forma unui sir de puncte, rez
200
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
201
varx[2]=rez[nops(rez)][2],f));
x1:=evalf(x1+h);
rez:=[op(rez),[x1,y1]];
od;
for i from 4 to N do
y1:=evalf(
y1+h/24*( 55*subs(varx[1]=rez[nops(rez)][1],
varx[2]=rez[nops(rez)][2],f) 59*subs(varx[1]=rez[nops(rez)-1][1],
varx[2]=rez[nops(rez)-1][2],f) +
37*subs(varx[1]=rez[nops(rez)-2][1],
varx[2]=rez[nops(rez)-2][2],f) 9*subs(varx[1]=rez[nops(rez)-3][1],
varx[2]=rez[nops(rez)-3][2],f)
));
y1:=evalf(
rez[nops(rez)][2]+h/24*(
9*subs(varx[1]=rez[nops(rez)][1]+h,
varx[2]=y1,f) +
19*subs(varx[1]=rez[nops(rez)][1],
varx[2]=rez[nops(rez)][2],f) 5*subs(varx[1]=rez[nops(rez)-1][1],
varx[2]=rez[nops(rez)-1][2],f) +
subs(varx[1]=rez[nops(rez)-2][1],
varx[2]=rez[nops(rez)-2][2],f)
));
x1:=x1+h;
rez:=[op(rez),[x1,y1]];
od;
end:
In continuare prezentam n acelasi sistem de coordonate solutia exacta a
problemei rezolvate anterior si solutiile obtinute cu metoda predictor-corector,
n care am variat ordinul metodei dar am pastrat constant numarul de puncte
n care s-a calculat solutia.
with(plots):
p0:=plot(1/3*x^3+x+2, x=0..1,color=black, thickness=2):
p2:=plot([seq(predictorcorector(diff(f(x),x)=x^2+1,0,2,0..1,N),
202
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
N=5..10)]):
display(p0,p1);
3.2
3
2.8
2.6
2.4
2.2
2
0
0.2
0.4
0.6
0.8
Se considera problema
y = p(x) y + q(x) y + r(x) x [a, b]
cu conditiile la frontiera mixte:
1 y(a) + 2 y (a) =
3 y(b) + 4 y (b) = .
(7.24)
(7.25)
LINIARE
7.7. PROBLEME LA LIMITA
203
ba
N +1
si notam Yi = y(xi), atunci determinarea valorilor Yi se reduce la rezolvarea
sistemului
AY = B
(7.26)
Daca mpartim intervalul [a, b] n N + 1 intervale de lungime h =
unde
A=
iar
4a1 2
1 32
b1 2h
a2
0
...
0
0
2
c1 + 2h 13
1
b2
a3
...
0
0
0 ...
c2
b3
...
0
0
0
...
0
0
...
...
...
...
...
bN1
c
cN1
4
0 ... aN 2hN+3
3
4c
4
bN + 2h N+3
Y = (Y1 , Y2 , ..., YN )
2ha1
h2 r(x1 )
2h1 32
h r(x2 )
.
B=
.
h2 r(xN 1 )
2hc
N
h2 r(xN )
2h3 + 34
(7.27)
(7.28)
(7.29)
h
p(xi )
(7.30)
2
bi = (2 + h2 q(xi ))
(7.31)
h
ci = 1 p(xi ).
(7.32)
2
In capetele intervalului, valorile aproximative ale solutiei sunt date de:
ai = 1 +
y(x0 ) =
h 2 y1
h1 + 2
si
y(xN +1 ) =
7.7.2
h 4 yN
h3 + 4
(7.33)
(7.34)
Problem
a rezolvat
a
y(1) = 1
pe intervalul intervalul [0, 1] (N = 3).
204
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
Rezolvare Avem:
p(x) = 0
q(x) = 0
1 = 1
2 = 0
3 = 1
4 = 0
1
10
h=
=
3+1
4
1
2
x1 =
x2 =
4
4
Inlocuind aceaste valori, se obtine sistemul
r(x) = x
=0
=1
x3 =
3
4
Ay = b
unde
1
2 1
0
64
2
A = 1 2 1
b = 64
61
0
1 2
64
si a carui solutie este:
27
y=
128
56
128
89
128
y(1) = 1.
Astfel, se obtine solutia aproximativa a problemei date sub forma unui sir de
puncte:
1 27
2 56
3 89
), ( ,
), ( ,
), (1, 1) .
(0, 0), ( ,
4 128 4 128 4 128
7.7.3
Probleme propuse
y(1) = 2
LINIARE
7.7. PROBLEME LA LIMITA
7.7.4
205
Implementare
A. Algoritmi
Date de intrare: ecuatia ec1, conditiile la frontiera ec2, ec3, si numarul
de puncte n care se cauta solutia, N
Date de iesire: lista rez a punctelor care definesc solutia
Algoritmul consta urmatoarele etape:
1. identificarea intervalului [a, b],a functiilor p, q, r precum si a coeficientilor
1 , 2 , 3 , 4 , ,
2. determinarea punctelor xi n care se calculeaza solutia, a matricei A si
a vectorului B
3. rezolvarea sistemului AY = B
4. returnarea listei de puncte de forma [(xi , Yi)] care alcatuiesc solutia
numerica a problemei
B. Programe MAPLE si rezultate
Observatia 7.7.1. Avand ecuatia si conditiile pe frontiera, se pot determina:
intervalul [a, b], functiile p, q, r, numele variabilei n care se scrie ecuatia, x,
precum si coeficientii 1 , 2 , 3 , 4 , , . Pentru aceasta, am construit
procedura coeficienti.
coeficienti:=proc(ec1::equation, ec2::equation, ec3::equation)
local f,xx,p,q,r,m,A,B,g1,g2,g3,g4;
#ecuatia ec1
if StringTools[Has](convert(lhs(ec1),string),"$2") or
StringTools[Has](convert(lhs(ec1),string),"diff(diff")
then f:=rhs(ec1);
elif StringTools[Has](convert(rhs(ec1),string),"$2") or
StringTools[Has](convert(lhs(ec1),string),"diff(diff")
then f:=lhs(ec1);
else
ERROR (prima ecuatie trebuie sa fie de tipul \n
diff(y(x),x$2)=p(x)*diff(y(x),x)+q(x)*y(x)+r(x));
fi;
if nops(indets(f,function)[1])=1 then
xx:=op(indets(f,function)[1]);
206
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
p:=coeff(f,indets(f,function)[2]);
q:=coeff(f-p*indets(f,function)[2],indets(f,function)[1]);
r:=f-p*indets(f,function)[2]-q*indets(f,function)[1];
else
xx:=op(indets(f,function)[2]);
p:=coeff(f,indets(f,function)[1]);
q:=coeff(f-p*indets(f,function)[2],indets(f,function)[2]);
r:=f-p*indets(f,function)[1]-q*indets(f,function)[2];
fi;
#capetele intervalului
m:=indets(lhs(ec2),{numeric,name});
A:=product(m[k],k=1..nops(m));
m:=indets(lhs(ec3),{numeric,name});
B:=product(m[k],k=1..nops(m));
#conditiile la frontiera
m:=[op(indets(ec2,function))];
if nops(m)=1 then m:=[op(m),0];fi;
if not StringTools[Has](convert(m[1],string),"diff") then
g1:=coeff(m[1],op(indets(m[1],function)));
if m[2]=0 then g2:=0
else g2:=coeff(m[2],op(indets(m[2],function)));
fi;
else
g2:=coeff(m[1],op(indets(m[1],function)));
if m[2]=0 then g1:=0
else g1:=coeff(m[2],op(indets(m[2],function)));
fi;
fi;
m:=[op(indets(ec3,function))];
if nops(m)=1 then m:=[op(m),0];fi;
if not StringTools[Has](convert(m[1],string),"diff") then
g3:=coeff(m[1],op(indets(m[1],function)));
if m[2]=0 then g4:=0
else g4:=coeff(m[2],op(indets(m[2],function)));
fi;
else
g4:=coeff(m[1],op(indets(m[1],function)));
if m[2]=0 then g3:=0
else g3:=coeff(m[2],op(indets(m[2],function)));
fi;
fi;
LINIARE
7.7. PROBLEME LA LIMITA
207
RETURN(A,B,xx,p,q,r,g1,g2,g3,g4,rhs(ec2),rhs(ec3));
end:
Procedura care returneaza sirul de puncte care aproximeaza solutia este
bvproblem.
bvproblem:=proc(ec1::equation, ec2::equation, ec3::equation,
N::integer)
local f,A,B,p,q,r,h,g1,g2,g3,g4,a,b,i,x,xx,AA,BB,yy;
f:=coeficienti(ec1,ec2,ec3);
A:=f[1];B:=f[2];xx:=f[3];
p:=f[4];q:=f[5];r:=f[6];
g1:=f[7];g2:=f[8];g3:=f[9];g4:=f[10];a:=f[11];b:=f[12];
h:=(B-A)/(N+1);
for i from 1 to N do
x[i]:=evalf(A+i*h);
od;
AA:=matrix(N,N,0);
BB:=vector(N,0);
for i from 1 to N do
AA[i,i]:=evalf(-(2+h^2*subs(xx=x[i],q)));
BB[i]:=evalf(h^2*subs(xx=x[i],r));
od;
for i from 1 to N-1 do
AA[i,i+1]:=evalf(1-h/2*subs(xx=x[i],p));
AA[i+1,i]:=evalf(1+h/2*subs(xx=x[i+1],p));
od;
AA[1,1]:=evalf(AA[1,1]-4*(1+h/2*subs(xx=x[1],p))
*g2/(2*h*g1-3*g2));
AA[1,2]:=evalf(AA[1,2]+(1+h/2*subs(xx=x[1],p))
*g2/(2*h*g1-3*g2));
AA[N,N-1]:=evalf(AA[N,N-1]-(1-h/2*subs(xx=x[N],p))
*g4/(2*h*g3+3*g4));
AA[N,N]:=evalf(AA[N,N]+4*(1-h/2*subs(xx=x[N],p))
*g4/(2*h*g3+3*g4));
BB[1]:=evalf(BB[1]-2*h*a*(1+h/2*subs(xx=x[1],p))/
(2*h*g1-3*g2));
BB[N]:=evalf(BB[N]-2*h*b*(1-h/2*subs(xx=x[N],p))/
(2*h*g3+3*g4));
evalm(AA);evalm(BB);
yy:=linsolve(AA,BB);
208
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
RETURN([
[evalf(A), evalf(( h*a-g2*yy[1] )/(h*g1+g2)) ],
seq([x[i],yy[i]],i=1..N),
[evalf(B), evalf(( h*b-g4*yy[N] )/(h*g3+g4)) ]
]);
end:
ec1:=diff(y(x),x$2)=-diff(y(x),x)+y(x)+1:
ec2:=y(0)=1:
ec3:=y(Pi/2)=0:
with(plots):
y1:=rhs(dsolve({ec1,ec2,ec3},y(x)));
p0:=plot(y1,x=0..Pi/2,thickness=2,color=black):
p1:=pointplot(bvproblem(ec1,ec2,ec3,5), symbol=circle,
symbolsize=10, color=red):
display(p0,p1);
((
y1 :=
51) x
)
2
( ( 51)
)
4
( (
(1 + 2 e
e(
5+1)
)
4
5+1)
)
4
( (
5+1) x
)
2
( ( 51)
)
4
51)
)
4
( ( 5+1)
)
4
((
(2 e
1)
7.8. METODA COLOCAT
IEI SI METODA CELOR MAI MICI PATRATE209
1
0.8
0.6
0.4
0.2
0
7.8
0.2
0.4
0.6
0.8
x
1.2
1.4
7.8.1
Breviar teoretic
Se considera problema
y + p(x) y + q(x) y + r(x) = f (x),
x [a, b]
(7.35)
(7.36)
N
X
i=1
ci i (x)
(7.37)
2 i (a)
= 0 si 3 i (b) +
4 i (b)
= 0, i = 1, N.
(7.38)
210
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
i=1
= f (xk )
0 (xk )
p(xk )0(xk )
(7.39)
q(xk )0 (xk ), k = 1, N
cj
i=1
(7.40)
7.8.2
Probleme rezolvate
y(1) = 1
folosind:
a. metoda colocatiei, cu N = 3
b. metoda celor mai mici patrate, cu N = 3
Indicatie: se considera 0 (x) = 0 si i (x) = sin ix, i = 1, 3.
Rezolvare
Se observa ca functiile 0 (x) = 0 si i (x) = sin ix, i = 1, 3 sunt functii
de clasa C 2 , liniar independente, si verifica conditiile (7.38). De asemenea,
avem:
p(x) = 1 q(x) = 1 f (x) = x.
si xi = 0 + 4i , i = 1, 3.
A. Rezolvare folosind metoda colocatiei
7.8. METODA COLOCAT
IEI SI METODA CELOR MAI MICI PATRATE211
Solutia problemei este de forma:
y3 (x) = 0 (x) + c1 1 (x) + c2 2 (x) + c3 3 (x).
Inlocuind n sistemul (7.39), obtinem urmatorul sistem:
1 2
1 9 2
c
+
(1
4
)c
+
c3 =
1
2
2
2
2
(1 2 )c1 (1 9 2 )c3 =
1 2
1 9 2
c1 (1 4 2 )c2 +
c3 =
2
2
1
4
3
4
2+1
c1 =
4(1 2 )
1
c2 =
4(1 4 2 )
c3 =
21
4(1 9 2 )
2+1
1
21
y3 (x) =
sin x
sin 2x +
sin 3x.
2
2
4(1 )
4(1 4 )
4(1 9 2 )
Solutia exacta a problemei date este
y(x) = x
sin x
sin 1
212
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
x
0.2
0.4
0.6
0.8
0.01
0.02
0.03
0.04
0.05
0.06
0.07
c1
f1 (x) f1 (x) + c2
f2 (x) f1 (x) + c3
f3 (x) f1 (x) =
x f1 (x)
0
0
0
0
Z 1
Z 1
Z 1
Z 1
c1
f1 (x) f2 (x) + c2
f2 (x) f2 (x) + c3
f3 (x) f2 (x) =
x f2 (x)
0
0
0
0
Z 1
Z 1
Z 1
Z 1
c1
f1 (x) f3 (x) + c2
f2 (x) f3 (x) + c3
f3 (x) f3 (x) =
x f3 (x)
0
2
(1 2 )
(1 4 2 )
c3 =
2
.
3(1 9 2 )
7.8. METODA COLOCAT
IEI SI METODA CELOR MAI MICI PATRATE213
Reprezentam n continuare pe acelasi sistem de coordonate, solutia exacta
a problemei initiale (cu linie ngrosata) si solutia obtinuta folosind metoda
celor mai mici patrate:
x
0.2
0.4
0.6
0.8
0.01
0.02
0.03
0.04
0.05
0.06
0.07
7.8.3
Probleme propuse
y(1) = 0
214
CAPITOLUL 7. ECUAT
II DIFERENT
IALE
BIBLIOGRAFIE
[1] St. Balint, L. Braescu, N. Bonchis, Metode numerice Timisoara, 2007
[2] C. Berbente, S. Mitran, S. Zancu, Metode Numerice, Ed. Tehnica,
Bucuresti, 1998.
[3] T.A. Beu, Calcul numeric n C, Editia a 2-a, Ed. Alabastra, ClujNapoca, 2000.
[4] G. Coman, Analiza Numeric
a , Ed. Libris, Cluj-Napoca, 1995.
[5] M. Dinu, G. Linca, Algoritmi si teme speciale de analiz
a numeric
a Ed.
Matrix Rom, Bucuresti, 1999.
[6] O. Dogaru, Gh. Bocsan, I. Despi, A. Ionica, V. Iordan, L. Luca, D.
Petcu, P. Popovici Informatic
a pentru definitivare si grad , Ed. de Vest,
Timisoara, 1998.
[7] W. Kelley, A. Peterson, Difference equation, An Introduction with Applications, Academic Press, Elsevier, 2000.
[8] St. Maruster, Metode numerice n rezolvarea ecuatiilor neliniare, Ed.
Tehnica, Bucuresti, 1981.
[9] P. Naslau, R. Negrea, L. Cadariu, B. Caruntu, D. Popescu, M. Balmez,
C. Dumitrascu, Matematici asistate pe calculator , Ed. Politehnica,
Timisoara, 2005.
[10] D. Petcu, Maple, un standard pentru matematica computerizat
a, Tipografia UVT, Timisoara, 1997
[11] V. A. Patel,Numerical Analysis, Humboldt State University, USA, 1994.
[12] MapleV4 - pagina de help
215