numerické algoritmy - základy algoritmizace a...
TRANSCRIPT
Numerické algoritmyZáklady algoritmizace a programování
9.listopadu 2011
Numerické algoritmy
Numerické algoritmy
Numerické rešení nelineární rovniceMetoda pulení intervaluNewtonova metodaMetoda tetiv
Numerická integraceObdélníková metodaLichobežníková metodaSimpsonova metoda
Numerické rešení Cauchyovy úlohyEulerova metoda
Numerické algoritmy
Numerické rešení nelineární rovnice
Úlohahledáme x ∈ R, pro které platí f (x) = 0.(x z rovnice neumíme vyjádrit),napr.f (x) = x3 − 3x2 − 9x + 5, f (x) = ln x − x
2 + 1Postup numerického rešení
1 Urcit interval, ve kterém leží jediný koren x ∈< a,b >2 Presvedcit se, že
funkce je spojitá v < a,b >hodnoty funkce v krajních bodech intervalumají ruzná znaménka (tj. v platí: f (a) · f (b) < 0)... funkce je ryze monotónní, prípadne, že funkce je bud’konvexní nebo konkávní v < a,b > (tj, první derivace 6= 0 adruhá derivace funkce v < a,b > nemení znaménko)(pro Newtonovu metodu))
3 Vybrat numerickou metodu a použít ji
Numerické algoritmy
Metody rešení
Metoda pulení intervalu (bisekce)Metoda tecen (Newtonova metoda)Metoda regula falsi (metoda tetiv)
Numerické algoritmy
Metoda pulení intervalu
Predpokládáme, žev intervalu < a,b > má rovnice f (x) = 0 jediné rešení (x∗)funkce f (x) je spojitá v < a,b >
v krajních bodech intervalu v platí: f (a) · f (b) < 0
Urcujeme približné rešení
xk =a + b
2
Jestliže f (xk ) = 0, pak xk jehledaným korenem x∗.Jinak hledáme v intervalu< xk ,b > nebo < a, xk >,takovém, že f (a) · f (b) < 0
a b
x1
�b
x∗
x2
-a
Numerické algoritmy
Metoda pulení intervalu
Predpokládáme, žev intervalu < a,b > má rovnice f (x) = 0 jediné rešení (x∗)funkce f (x) je spojitá v < a,b >
v krajních bodech intervalu v platí: f (a) · f (b) < 0
Urcujeme približné rešení
xk =a + b
2
Jestliže f (xk ) = 0, pak xk jehledaným korenem x∗.Jinak hledáme v intervalu< xk ,b > nebo < a, xk >,takovém, že f (a) · f (b) < 0
a bx1
�b
x∗
x2
-a
Numerické algoritmy
Metoda pulení intervalu
Predpokládáme, žev intervalu < a,b > má rovnice f (x) = 0 jediné rešení (x∗)funkce f (x) je spojitá v < a,b >
v krajních bodech intervalu v platí: f (a) · f (b) < 0
Urcujeme približné rešení
xk =a + b
2
Jestliže f (xk ) = 0, pak xk jehledaným korenem x∗.Jinak hledáme v intervalu< xk ,b > nebo < a, xk >,takovém, že f (a) · f (b) < 0
a bx1
�bx∗
x2
-a
Numerické algoritmy
Metoda pulení intervalu
Predpokládáme, žev intervalu < a,b > má rovnice f (x) = 0 jediné rešení (x∗)funkce f (x) je spojitá v < a,b >
v krajních bodech intervalu v platí: f (a) · f (b) < 0
Urcujeme približné rešení
xk =a + b
2
Jestliže f (xk ) = 0, pak xk jehledaným korenem x∗.Jinak hledáme v intervalu< xk ,b > nebo < a, xk >,takovém, že f (a) · f (b) < 0
a bx1
�bx∗
x2
-a
Numerické algoritmy
Metoda pulení intervalu
Predpokládáme, žev intervalu < a,b > má rovnice f (x) = 0 jediné rešení (x∗)funkce f (x) je spojitá v < a,b >
v krajních bodech intervalu v platí: f (a) · f (b) < 0
Urcujeme približné rešení
xk =a + b
2
Jestliže f (xk ) = 0, pak xk jehledaným korenem x∗.Jinak hledáme v intervalu< xk ,b > nebo < a, xk >,takovém, že f (a) · f (b) < 0
a bx1
�bx∗
x2
-a
Numerické algoritmy
Realizace
int puleni(float * x, float a, float b, float eps, float(*f)(float)){
/*funkce vraci 0, pokud byl koren nalezen, -1pokud byl interval zadan chybne*/if(f(a)*f(b)>0){return -1;}
*x=(a+b)/2;while(fabs(b-a)>eps){if(f(a)*f((*x)) > 0 )
a=*x;
zmenšení intervalu zleva
else b=*x;
zmenšení intervalu zprava
*x=(a+b)/2;}return 0;}
Numerické algoritmy
Realizace
int puleni(float * x, float a, float b, float eps, float(*f)(float)){
/*funkce vraci 0, pokud byl koren nalezen, -1pokud byl interval zadan chybne*/if(f(a)*f(b)>0){return -1;}
*x=(a+b)/2;while(fabs(b-a)>eps){if(f(a)*f((*x)) > 0 )
a=*x; zmenšení intervalu zlevaelse b=*x; zmenšení intervalu zprava
*x=(a+b)/2;}return 0;}
Numerické algoritmy
Struktura programu
#include<stdio.h>#include<math.h>float f(float x) {return asin(x)+2*x+1;}int puleni(float * x, float a, float b, float eps, float(*f)(float)). . .main()
{float x; int chyba;chyba = puleni(&x, -1, 1, 0.001, f) ;if (chyba != 0) /* nebo if(chyba) */printf("\nna zadanem intervalu neni koren");else printf("\nKoren je %f", x);}
Numerické algoritmy
Presnost aproximace
Po k krocích metody pulení najdeme približné rešení xk , kterése od presného rešení x∗ liší :
|xk − x∗| < b − a2k
Pokud na zadaném intervalu je jediný koren, cyklus budeukoncen, protože v každé iteraci se |b − a| zmenší na polovinu,tedy po konecném poctu iterací bude|b − a| < ε
Numerické algoritmy
Newtonova metoda – metoda tecen
Predpokládáme, žev intervalu < a,b > leží práve jeden koren (x∗)f ′(x) a f ′′(x) nemení znaménko v < a,b >
pro pocátecní aproximaci x0 platí f (x0) · f ′′(x0) > 0Pak posloupnost {xk}
xk+1 = xk −f (xk )
f ′(xk )
(xk+1 je prusecík tecny s osou x)Konverguje k x∗ a platí:
|xk − x∗| ≤ M2
2m1(xk − xk−1)
2,
M2 = max |f ′′(x)|,m1 = min|f ′(x)|, x ∈< a,b >
x0=a
LLLLLLL
x1\\
x2
b
Numerické algoritmy
Newtonova metoda – metoda tecen
Predpokládáme, žev intervalu < a,b > leží práve jeden koren (x∗)f ′(x) a f ′′(x) nemení znaménko v < a,b >
pro pocátecní aproximaci x0 platí f (x0) · f ′′(x0) > 0Pak posloupnost {xk}
xk+1 = xk −f (xk )
f ′(xk )
(xk+1 je prusecík tecny s osou x)Konverguje k x∗ a platí:
|xk − x∗| ≤ M2
2m1(xk − xk−1)
2,
M2 = max |f ′′(x)|,m1 = min|f ′(x)|, x ∈< a,b >
x0=aLLLLLLL
x1
\\
x2
b
Numerické algoritmy
Newtonova metoda – metoda tecen
Predpokládáme, žev intervalu < a,b > leží práve jeden koren (x∗)f ′(x) a f ′′(x) nemení znaménko v < a,b >
pro pocátecní aproximaci x0 platí f (x0) · f ′′(x0) > 0Pak posloupnost {xk}
xk+1 = xk −f (xk )
f ′(xk )
(xk+1 je prusecík tecny s osou x)Konverguje k x∗ a platí:
|xk − x∗| ≤ M2
2m1(xk − xk−1)
2,
M2 = max |f ′′(x)|,m1 = min|f ′(x)|, x ∈< a,b >
x0=aLLLLLLL
x1\\
x2 b
Numerické algoritmy
Vysvetlení...
xk+1 je prusecík tecny ke grafu f (x) v bode [xk , f (xk )] sosou x .
Rovnice tecny: y − yk = f ′(xk )(x − xk ), yk = f (xk )
Osa x : y = 0, prusecík s osou x má souradnice [xk+1,0]Tedy 0− f (xk ) = f ′(xk )(xk+1 − xk )⇒
xk+1 = xk −f (xk )
f ′(xk )
Numerické algoritmy
Vysvetlení...
xk+1 je prusecík tecny ke grafu f (x) v bode [xk , f (xk )] sosou x .Rovnice tecny: y − yk = f ′(xk )(x − xk ), yk = f (xk )
Osa x : y = 0, prusecík s osou x má souradnice [xk+1,0]Tedy 0− f (xk ) = f ′(xk )(xk+1 − xk )⇒
xk+1 = xk −f (xk )
f ′(xk )
Numerické algoritmy
Vysvetlení...
xk+1 je prusecík tecny ke grafu f (x) v bode [xk , f (xk )] sosou x .Rovnice tecny: y − yk = f ′(xk )(x − xk ), yk = f (xk )
Osa x : y = 0, prusecík s osou x má souradnice [xk+1,0]
Tedy 0− f (xk ) = f ′(xk )(xk+1 − xk )⇒
xk+1 = xk −f (xk )
f ′(xk )
Numerické algoritmy
Vysvetlení...
xk+1 je prusecík tecny ke grafu f (x) v bode [xk , f (xk )] sosou x .Rovnice tecny: y − yk = f ′(xk )(x − xk ), yk = f (xk )
Osa x : y = 0, prusecík s osou x má souradnice [xk+1,0]Tedy 0− f (xk ) = f ′(xk )(xk+1 − xk )⇒
xk+1 = xk −f (xk )
f ′(xk )
Numerické algoritmy
Realizace
int newton(float * x, float a, float b, float eps, float (*f)(float), float(*df)(float)){
/* funkce vraci -1 pri nesplneni f(a)f(b)<0.*//* -2 pri nulove derivaci*/
float pom;if(f(a)*f(b)>0)return -1;pom = a-(f(a)*(b-a))/(f(b)-f(a));if (f(pom)*df(pom)>0) *x=a; else *x=b;/*výber x = a nebo x = b ...*/
while(fabs(f(*x))>eps){if(fabs(df(*x))<eps) return -2;*x=*x-f(*x)/df(*x);}return 0;}
Numerické algoritmy
Vysvetlení
pom je prusecík prímky [a, f (a)][b, f (b)] s osou x .V intervalu < a,b > mohou nastat 4 situace:
f (x) je rostoucí⇒ f ′ > 0 a konvexní⇒ f (pom) < 0 . . . x0 = bf (x) je rostoucí⇒ f ′ > 0 a konkávní⇒ f (pom) > 0 . . . x0 = af (x) je klesající⇒ f ′ < 0 a konvexní⇒ f (pom) < 0 . . . x0 = af (x) je klesající⇒ f ′ < 0 a konkávní⇒ f (pom) > 0 . . . x0 = b
Numerické algoritmy
Struktura programu
#include<stdio.h>#include<math.h>float f(float x) {return x*x-atan(x)-1;}float df(float x){return 2*x - 1/(1+x*x);}int newton(float * x, float a, float b, float eps, float(*f)(float), float(*df)(float)). . .main()
{float x; int chyba;chyba = newton(&x, -sqrt(3), 0, 0.001, f, df) ;if (chyba != 0)printf("\nchybne zadany interval");else printf("\nKoren je %f", x);}
Numerické algoritmy
Metoda tetiv – regula falsi
Predpokládáme, žev intervalu < a,b > leží práve jeden koren (x∗)f ′′(x) nemení znaménko v < a,b >
pocátecní aproximaci x0 volíme :v prípade, že f (b) · f ′′(b) > 0, x0 = a ,v prípade, že f (a) · f ′′(a) > 0, x0 = b
Pak posloupnost{xk}:
xk+1 = xk−b − xk
f (b)− f (xk )·f (xk ) resp. xk+1 = xk−
xk − af (xk )− f (a)
·f (xk )
(xk+1 je prusecík prímky [a, f (a)][b, f (b)] s osou x)Konverguje k x∗ a platí:
|xk − x∗| ≤ M1 −m1
m1|xk − xk−1|,
M1 = max |f ′(x)|,m1 = min|f ′(x)|, x ∈< a,b >
Numerické algoritmy
Realizace
int tetivy(float * x, float a, float b, float eps, float (*f)(float)){
/* funkce vraci -1 pri nesplnenif(a)f(b)<0...*/if(f(a)*f(b)>0)return -1;*x = a-(f(a)*(b-a))/(f(b)-f(a));while(fabs(f(*x))>eps){if (f(*x)*f(a)>0)
a=*x;else b=*x;*x = a-(f(a)*(b-a))/(f(b)-f(a));}return 0;}
Numerické algoritmy
Struktura programu
#include<stdio.h>#include<math.h>float f(float x) {return x*x-atan(x)-1;}int tetivy(float * x, float a, float b, float eps, float(*f)(float)). . .main()
{float x; int chyba;chyba = tetivy(&x, -sqrt(3), 0, 0.001, f) ;if (chyba != 0)printf("\nchybne zadany interval");else printf("\nKoren je %f", x);}
Numerické algoritmy
Rekapitulace metod rešení f (x) = 0
Metoda pulení intervalu
x = (a + b)/2
Newtonova metoda
xk+1 = xk −f (xk )
f ′(xk )
Metoda tetiv
xk+1 = xk−b − xk
f (b)− f (xk )·f (xk ) resp. xk+1 = xk−
xk − af (xk )− f (a)
·f (xk )
Numerické algoritmy
Jak urcit interval?
Neformálne - graficky
Formálne - z prubehu funkce (urcit extrémy a funkcníhodnoty v extrémních bodech)
Numerické algoritmy
Jak urcit interval?
Neformálne - grafickyFormálne - z prubehu funkce (urcit extrémy a funkcníhodnoty v extrémních bodech)
Numerické algoritmy
Príklady
f (x) = x3 − 3x2 − 9x + 5
Puleni Newton Tetivyx = 0.000 1.000 0.25x = 0.500 0.500 0.475410x = 0.250 0.489 0.488264x = 0.375 0.488845
x = 0.4375x = 0.46875
x = 0.484375x = 0.492188x = 0.488281x = 0.490234x = 0.489258
f (x) = 0 má 3 reálné koreny:x1 < −1, x2 ∈ (−1,1), x3 > 3
Numerické algoritmy
Príklady
f (x) = x3 − 3x2 − 9x + 5
Puleni Newton Tetivyx = 0.000 1.000 0.25x = 0.500 0.500 0.475410x = 0.250 0.489 0.488264x = 0.375 0.488845
x = 0.4375x = 0.46875
x = 0.484375x = 0.492188x = 0.488281x = 0.490234x = 0.489258
f (x) = 0 má 3 reálné koreny:x1 < −1, x2 ∈ (−1,1), x3 > 3
Numerické algoritmy
f (x) = ln x − x2 + 1
Puleni Newton Tetivyx = 5.000000 6.000000 5.299484x = 5.500000 5.375278 5.354840x = 5.250000 5.356713x = 5.375000x = 5.312500x = 5.343750x = 5.359375x = 5.351562x = 5.355469x = 5.357422x = 5.356445
f (x) = 0 má 2 koreny:x1 ∈ (−1
e ,1) x2 ∈ (4,6)
Numerické algoritmy
f (x) = ln x − x2 + 1
Puleni Newton Tetivyx = 5.000000 6.000000 5.299484x = 5.500000 5.375278 5.354840x = 5.250000 5.356713x = 5.375000x = 5.312500x = 5.343750x = 5.359375x = 5.351562x = 5.355469x = 5.357422x = 5.356445
f (x) = 0 má 2 koreny:x1 ∈ (−1
e ,1) x2 ∈ (4,6)
Numerické algoritmy
f (x) = ex − x − 2
Puleni Newton Tetivyx = -0.500000 -2.000000 -1.026490x = -1.250000 -1.843482 -1.824469x = -1.625000 -1.841406 -1.841167x = -1.812500x = -1.906250x = -1.859375x = -1.835938x = -1.847656x = -1.841797x = -1.838867x = -1.840332x = -1.841064
f (x) = 0 má 2 koreny:x1 ∈ (−2,1) x2 ∈ (1,2)
Numerické algoritmy
f (x) = ex − x − 2
Puleni Newton Tetivyx = -0.500000 -2.000000 -1.026490x = -1.250000 -1.843482 -1.824469x = -1.625000 -1.841406 -1.841167x = -1.812500x = -1.906250x = -1.859375x = -1.835938x = -1.847656x = -1.841797x = -1.838867x = -1.840332x = -1.841064
f (x) = 0 má 2 koreny:x1 ∈ (−2,1) x2 ∈ (1,2)
Numerické algoritmy
f (x) = x2 − arctgx − 1
Puleni Newton Tetivyx = 1.000000 2.000000 0.691359x = 1.500000 1.501881 1.179720x = 1.250000 1.400912 1.344527x = 1.375000 1.396164 1.384690x = 1.437500 1.393650x = 1.406250 1.395609x = 1.390625 1.396035x = 1.398438x = 1.394531x = 1.396484x = 1.395508
f (x) = 0 má 2 koreny:x1 ∈ (−2,0) x2 ∈ (0,2)
Numerické algoritmy
f (x) = x2 − arctgx − 1
Puleni Newton Tetivyx = 1.000000 2.000000 0.691359x = 1.500000 1.501881 1.179720x = 1.250000 1.400912 1.344527x = 1.375000 1.396164 1.384690x = 1.437500 1.393650x = 1.406250 1.395609x = 1.390625 1.396035x = 1.398438x = 1.394531x = 1.396484x = 1.395508
f (x) = 0 má 2 koreny:x1 ∈ (−2,0) x2 ∈ (0,2)
Numerické algoritmy
f (x) = arcsinx + 2x + 1
Puleni Newton Tetivyx = -0.250000 -0.500000 -0.328170x = -0.375000 -0.334026 -0.331167x = -0.312500 -0.331209x = -0.343750x = -0.328125x = -0.335938x = -0.332031x = -0.330078x = -0.331055
f (x) = 0 má 1 koren:x1 ∈< −0.5,0 >
Numerické algoritmy
f (x) = arcsinx + 2x + 1
Puleni Newton Tetivyx = -0.250000 -0.500000 -0.328170x = -0.375000 -0.334026 -0.331167x = -0.312500 -0.331209x = -0.343750x = -0.328125x = -0.335938x = -0.332031x = -0.330078x = -0.331055
f (x) = 0 má 1 koren:x1 ∈< −0.5,0 >
Numerické algoritmy
Výpocet urcitého integrálu
∫ b
af (x)dx
Funkce f (x) je na intervalu < a,b > spojitá.Princip numerického výpoctu:
interval < a,b > rozdelíme na intervaly délky h.presnou plochu nahradíme plochou obdélníka,lichobežníka ,...plochy vypocteme a secteme
Numerické algoritmy
Metody
obdélníková metoda∫ b
af (x) dx ' h · (f (a) + f (a + h) + · · ·+ f (a + ih) · · ·+ f (b))
hn∑
i=0
f (a + ih)
lichobežníková metoda∫ b
af (x) dx ' h·(1
2f (a)+f (a+h)+· · ·+f (a+ih) · · ·+f (b−h)+
12
f (b))
h
(f (a) + f (b)
2+
n−1∑i=1
f (a + ih)
)Simpsonova metoda∫ b
af (x) dx ' h
3·(f (a)+4f (a+h)+2f (a+2h)+· · ·+4f (b−h)+f (b))
Numerické algoritmy
Realizace souctu
float s_obd (float a, float b, int n
, float (∗ f)(float)
)/∗scitani funkcnich hodnot obdelnikovou metodou∗/{float s, x, h;h=fabs(b-a)/n;s=0; x=a;
while(x<b){s=s+f(x);x=x+h;}return h∗s;}
float s_lich (float a, float b, int n, float (∗ f)(float)
)
/∗scitani funkcnich hodnot lichobeznikovou metodou∗/{float s, x, h;h=fabs(b-a)/n;s=(f(a)+f(b))/2; x=a+h;
while(x<b){s=s+f(x);x=x+h;}return h∗s;}
Numerické algoritmy
Realizace souctu
float s_obd (float a, float b, int n, float (∗ f)(float))/∗scitani funkcnich hodnot obdelnikovou metodou∗/{float s, x, h;h=fabs(b-a)/n;s=0; x=a;
while(x<b){s=s+f(x);x=x+h;}return h∗s;}
float s_lich (float a, float b, int n, float (∗ f)(float)
)
/∗scitani funkcnich hodnot lichobeznikovou metodou∗/{float s, x, h;h=fabs(b-a)/n;s=(f(a)+f(b))/2; x=a+h;
while(x<b){s=s+f(x);x=x+h;}return h∗s;}
Numerické algoritmy
Realizace souctu
float s_obd (float a, float b, int n, float (∗ f)(float))/∗scitani funkcnich hodnot obdelnikovou metodou∗/{float s, x, h;h=fabs(b-a)/n;s=0; x=a;
while(x<b){s=s+f(x);x=x+h;}return h∗s;}float s_lich (float a, float b, int n
, float (∗ f)(float)
)/∗scitani funkcnich hodnot lichobeznikovou metodou∗/{float s, x, h;h=fabs(b-a)/n;s=(f(a)+f(b))/2; x=a+h;
while(x<b){s=s+f(x);x=x+h;}return h∗s;}
Numerické algoritmy
Realizace souctu
float s_obd (float a, float b, int n, float (∗ f)(float))/∗scitani funkcnich hodnot obdelnikovou metodou∗/{float s, x, h;h=fabs(b-a)/n;s=0; x=a;
while(x<b){s=s+f(x);x=x+h;}return h∗s;}float s_lich (float a, float b, int n, float (∗ f)(float))/∗scitani funkcnich hodnot lichobeznikovou metodou∗/{float s, x, h;h=fabs(b-a)/n;s=(f(a)+f(b))/2; x=a+h;
while(x<b){s=s+f(x);x=x+h;}return h∗s;}
Numerické algoritmy
Kolik vnitrních bodu?
Jedna z možností:volím n=10pocítám s_n a s_2ndokud |s2n − sn| > ε "zpresnuji", tj. zvetšujeme n
Numerické algoritmy
Integrace
float integral_obd(float a, float b, float eps, float(*f)(float)){ float s1,s2;
int n=10;s1 = s_obd(a,b,n,f);n=2*n;s2 = s_obd(a,b,n,f);while(fabs(s2-s1)>eps){s1=s2; n=2*n; s2 = s_obd(a,b,n,f);}return s2; }
Numerické algoritmy
Struktura programu v C
#include<stdio.h>#include<math.h>float f (float x) { return log(2+sin(x)); }float s_obd ( . . . ) { . . . }float integral (. . . ) { . . . }main (){float s;s= integral(0, M_PI, 0.001, f);printf("integral : %f", s);}
Numerické algoritmy
PRÍKLAD
Dány funkce f1(x) = 2x + 1, f2(x) = x5, f3(x) = 1−x3 .
Urcit plochu omezenou temito 3 funkcemi.
Numerické algoritmy
Postup rešení
obrázekurcíme prusecíky x12, x13, x23 jako rešení nelineárníchrovnic
f1(x)− f2(x) = 0, f1(x)− f3(x) = 0, f2(x)− f3(x) = 0
plochu P urcíme pomocí výpoctu urcitých integrálu
P =
∫ x12
x13
f1(x) dx −∫ x23
x13
f3(x) dx −∫ x12
x23
f2(x) dx
Numerické algoritmy
Realizace
definujeme funkcefloat f1(float x){return pow(2,x)+1;}float f2(float x){return pow(x,5);}float f3(float x){return (1-x)/3;}float f12(float x){return pow(2,x)+1 -pow(x,5);}
float f13(float x){return pow(2,x)+1 - (1-x)/3;}
float f23(float x){return pow(x,5) - (1-x)/3;}
odhadneme intervaly, ve kterých se funkce protínajíx13 ∈< −3,−2 >, x23 ∈< 0,1 >, x12 ∈< 1,2 >
urcíme prusecíky a plochutetivy(&x13,-3,-2,0.0001,f13);tetivy(&x23,0,1,0.0001,f23);tetivy(&x12,1,2,0.0001,f12);P1 = integral_simp(x13, x12, 0.001, f1);P2 = integral_simp(x13, x23, 0.001,f3);P3 = integral_simp(x23,x12,0.001,f2);printf("plocha = %f\n",P1-P2-P3);
Numerické algoritmy
Struktura programu#include<stdio.h>
#include<math.h>float f1(float x){return pow(2,x)+1;}float f2(float x){return pow(x,5);}float f3(float x){return (1-x)/3;}float f12(float x){return pow(2,x)+1 -pow(x,5);}
float f13(float x){return pow(2,x)+1 - (1-x)/3;}
float f23(float x){return pow(x,5) - (1-x)/3;}
int tetivy(float * x, float a, float b, float eps, float(*f)(float)){. . . }float soucet_simp(. . . ){ . . . }float integral_simp(. . . ){ . . . }main() {
float x12,x13,x23,P1,P2,P3;tetivy(&x13,-3,-2,0.0001,f13);tetivy(&x23,0,1,0.0001,f23);tetivy(&x12,1,2,0.0001,f12);P1 = integral_simp(x13, x12, 0.001, f1);P2 = integral_simp(x13, x23, 0.001,f3);P3 = integral_simp(x23,x12,0.001,f2);printf("plocha = %f\n",P1-P2-P3); }
Numerické algoritmy
Výsledky
x12 = 1.2793x13 = −2.5223x23 = 0.6505P = 4.29
Numerické algoritmy
Cauchyova úloha pro obycejnou diferenciální rovnici
y ′ = f (x , y), y(x0) = y0
Víme, že v intervalu existuje jediné rešení ...Volíme krok h = . . .Napocítáme hodnoty hledané funkce
yi+1 = yi + h · f (xi , yi), xi = x0 + i · h
Uvedený postup: Eulerova metoda. Existují jiné.
Numerické algoritmy
Realizace
Urcit hodnoty funkce znamená urcit pole hodnot.float * euler (float x0, float y0, float h, int pocet, float (*f)(float, float)){ int i;
float * vysledek;vysledek = (float *) malloc((pocet+1) * sizeof(float));
vysledek[0]=y0;for(i = 1; i<= pocet; i++){ y[i]=y[i-1] = h* f(x0,y[i-1]); x0 = x0+h; }return vysledek;}
Numerické algoritmy
Jak uvidíme výsledek
Hodnoty x,y mužeme zapsat do souboru a ... napr. zobrazit.Presnost Eulerovy metody : O(h).Jak volit h ?
pocítáme s kroky h a 0.5h,urcíme normu rozdílu napocítaných hodnot ve stejnýchx–ových bodech
Pozor na nespojitost rešení!
Numerické algoritmy
Rešení diferenciální rovnice v MATLABu
Obycejná diferenciální rovnice 1. rádu,
y ′ +yx=
1x + 3
, y(−2) = 4
nebodydx
=3x2
2y, y(0) = 1
Lineární diferenciální rovnice 2. rádu s konstantnímikoeficienty,
y ′′ − 9y = 5e2t , y(0) = 0, y ′(0) = 3
Lineární diferenciální rovnice 2. rádu s promennýmikoeficienty,
y ′′ + xy =1
2− x, y(0) = 0.25, y ′(0) = 0
Lineární soustavy,
X =
(1 14 −2
)X , X
(05
)Nelineární autonomní spustavy,
x = yy = −(1
9 − x2)x
Numerické algoritmy
Rešení v symbolických promenných : funkce dsolve
Rovnici upravíme na tvar : y ′ = f (x , y).dsolve(’Dy = 1/(x+3)-y/x’,’y(-2)=4’,’x’)dsolve(’Dy = 3*xˆ2/(2*y)’,’y(0)=1’,’x’)dsolve(’D2y = 5*exp(2*t)+9*y’,’y(0)=0, Dy(0)=3’,’x’)dsolve(’D2y = 1/(2-x)-x*y’, ’y(0)=0.25, Dy(0)=0’, ’x’)dsolve(’Dy = x+y, Dy = 4*x -2y’, ’x(0)=0, y(0)=5’, ’t’)dsolve()Ne vždy je rešení nalezeno ...
Numerické algoritmy
Rešení pomocí numerických metod ode.. MATLABu
Je nutné vytvorit .m – funkci pro f(x,y):Pro rovnici 1. rádu:function v = f1(x,y)v = 1/(x+3) - y/x% funkce vrací jednu hodnotufunction v = f2(x,y)v = 3*xˆ2/(2*y)
Numerické algoritmy
Pro rovnici 2. a vyššího rádu:
function V = f(x,Y)% predpokládáme, že Y je vektor hodnot y1 . . . yn% n je rád rovnice (nejvyšší derivace)% funkce vrací vektor – sloupec y –vých hodnot, urcenýchpodle následujícího :% V(1) = Y(2), (V(i) = Y(i+i), i = 1 . . . n-1)% V(n) = pravá strana rešené rovnice, v oznaceních :% Y(1) odpovídá y, Y(2) odpovídá y ′ . . .% funkce musí vracet vektor – sloupec (požadavek ode) Tedypro príklad 3:function V = f3(x, Y)V(1) = Y(2)V(2) = 5*exp(2*x) + 9*Y(1)V = V’ % vektor sloupec!
Numerické algoritmy
Pro soustavu diferenciálních rovnic 1. rádu
(príklady 4,5) vytvoríme funkci, která vrací vektor hodnot,jednotlivé prvky vektoru odpovídají pravým stranám.Pro vektor X = (x(t), y(t))T použijeme oznacení Y.Pro príklad 4:(
xy
)=
(1 14 −2
)(xy
),⇒
(xy
)=
(1x + 1y
4x + (−2y)
)function V = f4(x, Y)V(1) = Y(1)+Y(2)V(2) = 4*Y(1) - 2*Y(2)V = V’ % vektor sloupec!Pro príklad 5:function V = f5(x, Y)V(1) = Y(2)V(2) = -(1/9-xˆ2)*xV = V’ % vektor sloupec!
Numerické algoritmy
Použití funkce ode45:
první parametr : odkaz na funkci,druhý parametr : [pocátecní_hodnota_x poslední_hodnota_x ]tretí parametr: [hodnota_y_x0 (prípadne pocátecní hodnotyderivací)]Pr. 1: [x1, y1] = ode45(@f1, [-2 -0.1], 4)Pr. 2: [x2, y2] = ode45(@f2, [0 3], 1)Pr. 3: [x3, y3] = ode45(@f3, [0 2], [0.25 0])Pr. 4: [x4, y4] = ode45(@f4, [0 2], [0.25 0])Pr. 3: [x5, y5] = ode45(@f5, [0 2], [0.25 0])Zobrazení rešení:plot(x1, y1)plot(x2, y2)plot(x3, y3(:,1))plot(x1, y4(:,1))plot(x1, y5(:,1))y3, y4, y5 jsou matice: 1. sloupec – hodnoty funkce, 2. sloupec– hodnoty derivace
Numerické algoritmy
Rešení Eulerovou metodou
napíšeme .m funkci euler, vhodnou pro jednu i více rovnic:function [X V] = euler(f, x, Y, h, N) % první parametr : funkce% druhy: pocátecní hodnota x% treti: (vektor – rádek) pocátecních hodnot Y% ctvrtý : velikost kroku h% pátý: pocet kroku, který chceme provéstX(1) = x;[m n] = size(Y)V(1) = Y;for i=2:NV(i+1) = V(i) + h*f(X(i-1), Y(i-1))X(i) = X(i-1)+h;endV = V’;
Numerické algoritmy