numerické algoritmy - základy algoritmizace a...

Post on 03-Mar-2020

38 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

top related