Professional Documents
Culture Documents
Prvi Newton-Ov Interpolacioni Polinom
Prvi Newton-Ov Interpolacioni Polinom
Prvi Newton-Ov Interpolacioni Polinom
PEDAGOŠKI FAKULTET
ODSJEK MATEMATIKA I FIZIKA
SMJER MATEMATIKA I INFORMATIKA
Edin Pašić
Bihać,2008.
Sadržaj
7
8
12
17
2
kriteriju odredimo aproksimacijsku funkciju . U tom slučaju možemo birati
informacije o f koje ćemo koristiti. Jednako tako, možemo ocijeniti grešku
dobivene aproksimacije, obzirom na pravu vrijednost funkcije f .
(b) Funkcija f nije poznata, ali su poznate samo neke informacije o njoj, na
primjer, vrijednosti na nekom skupu tačaka. Zamjenska funkcija određuje
se iz raspoloživih informacija, koje, osim samih podataka, uključuju očekivani
oblik ponašanja podataka, tj. funkcije . U ovom se slučaju ne može napraviti
ocjena pogreške bez dodatnih informacija o nepoznatoj funkciji f .
Varijanta (b) je puno češća u praksi. Najčešće se javlja kod mjerenja raznih veličina, jer osim
izmjerenih podataka, pokušavamo aproksimirati i podatke koji se nalaze “izmedu” izmjerenih
tačaka. Primijetimo da se kod mjerenja javljaju i pogreške mjerenja, pa postoje posebne
tehnike za ublažavanje tako nastalih grešaka. Funkcija bira se prema prirodi modela, ali
tako da bude relativno jednostavna za računanje. Ona obično ovisi o parametrima koje treba
odrediti po nekom kriteriju.
Kriteriji aproksimacije
Interpolacija
3
Pn ( x) a0 x n a1 x n 1 a n 1 x a n , (x 0 x1 x n ) ..........(*)
takav da je
Pn ( x k ) f k ........(**)
Dokaz. Ako u jednakosti (*) zamjenimo uslove (**) dobijamo sistem jednačina za
određivanje koeficijenata a 0 , a1 , , a n , koji glasi
x0n x0n1 x0 1 a0 f 0
n
x1 x1n1 x1 1 a1 f1
Kako je determinanta
ovog sistema x n xnn 1
x n 1 a n f n
Vandermondova, koja ima n
n
vrijednost (x
i , j 0,i j
i x j ) 0 , sistem ima jedinstveno rješenje, za koeficijente traženog
polinoma.
Dakle, interpolacioni polinom Pn (x ) je jedinstven.
Postoji više metoda za određivanje interpolacionog polinoma.U ovom seminarskom radu
obraditi ćemo prvi Newton-ov interpolacioni polinom.
Pn ( x) a0 a1 ( x x0 ) a2 ( x x0 )( x x1 ) an ( x x0 )( x x1 )( x xn 1 )
4
P1 ( x ) f x0 f x0 , x1 ( x x0 )
Uzmimo sada da je n=2. Polinom P2 , čiji graf treba prolaziti tačkama T0 , T1 , T2 ima oblik
P2 ( x) f x0 f x0 , x1 ( x x0 ) ( x x0 )( x x1 ). ………..(*)
y1 y0 y y1 f x1 , x2 f x0 , x1
f x0 x1 , f x1 , x2 2 , f x0 , x1 , x2
x1 x0 x2 x1 x2 x0
P2 ( x) f x0 f x0 , x1 ( x x0 ) f x0 , x1 , x2 ( x x0 )( x x1 ).
Pn ( x) f x0 f x0 , x1 ( x x0 ) f x0 , x1 , xn ( x x0 )( x x1 )( x xn 1 )
f x1 , x2 , , xi f x0 , x1 , , xi 1
f x0 , x1 , , xi , i 0,1, , n zovemo podijeljene
xi x0
razlike.
Uvedemo li oznaku
5
x x0
q
h
polinom možemo zapisati i u obliku:
q (q 1) 2 q (q 1)(q 2)(q n 1) n
Pn ( x) f 0 qf 0 f0 f0
2! n!
Interpolacija prvim Newton-ovim polinomom se vrši kada se interpolacija vrši u okolini tačke
x x0 . Ako je x x0 kažemo da se vrši ekstrapolacija.
Ocjena pogreške
g ( x ) f ( x ) Pn ( x ) k ( x) ..........(2)
gdje ćemo konstantu k odrediti tako da bude g ( x) 0 . Na taj način funkcija g imat će
barem ( n 2) nultačke. Prema Rolleovom teoremu funkcija g ´ ima barem ( n 1) nultačku,
funkcija g ˝ barem n nultačaka, ... , a funkcija g ( n 1) ima barem jednu nultačku a, b .
d n 1 P ( x) 0
Primjetite da je n . Osim toga, kako je polinom ( n 1) -og reda s vodećim
dx n1
d n 1
koeficijentom 1, imamo n 1 ( x ) (n 1)! . Zato je 0 g ( n1) ( ) f ( n 1) ( ) k (n 1)!
d
( n 1)
f ( )
odakle slijedi k . Na taj način smo odredili konstantu k tako da je g ( x) 0 .
(n 1)!
Zato iz (2) sljedi (1).
( n 1) M n 1
Ako sa M n 1 xmax
a ,b
f ( x) , onda iz (1) sljedi f ( x ) Pn ( x ) ( x) ,
(n 1)!
što znači da pogreška aproksimacije ovisi o ponašanju funkcije .
6
#include<iostream>
using namespace std;
for(i=0;i<n;i++)
for(j=n+1;j>i;j--)
yv[j]=((yv[j]-yv[j-1])/(xv[j]-xv[j-i-1]));
cout<<"\n\n...........Ispis polinoma..............\n\n\n";
cout<<"Trazeni polinom ima sljedeci oblik:\n\n";
cout<<" "<<"P(x)= "<<yv[0];
for(i=0;i<n-1;i++){
if(yv[i+1]==0); else if(yv[i+1]>0) cout<<"+"<<yv[i+1];
else if(yv[i+1]<0) cout<<yv[i+1];
int m=i;
for(int j=0;j<=m;j++){
if(xv[j]==0) cout<<"x";
else{
cout<<"(x";
if(xv[j]>0) cout<<"-"<<xv[j]<<")";
else cout<<"+"<<((-1)*(xv[j]))<<")";
}
}
}
cout<<"\n\n.....Vrijednost polinoma u zadanim tackama.....\n\n";
for(j=0;j<m;j++){
mult=1.0;
y=yv[0];
for(i=1;i<n;i++)
y+=yv[i]*(mult*=(niz[j]-xv[i-1]));
cout.precision( p );
cout<<" P("<<niz[j]<<")= "<< fixed << y << endl;
}
}
void main(){
double *xv,*yv;
int n, i,p;
7
}
double *niz;
int m,j;
newton(niz,xv,yv,n,m,p);
Komentar koda
#include<iostream>
using namespace std;
Prvi znak # simbol, je signal pretprocesoru. Include je pretprocesorska instrukcija koja kaže :
« Pronađi tu datoteku i pročitaj je prije nego kreneš s prevođenjem programa. »
void main() je glavna funkcija. Počinje s otvorenom zagradom ({).U njoj se nalazi sljedeće:
double *xv,*yv;
int n, i,p;
Pretstavlja deklaraciju varijabli gdje su *xv, *yv pokazivači na podatke tipa double, a n, i, p
varijable tipa int. xv- u našem slučaju će biti niz u koji ćemo smjestiti x-koordinate svih
tačaka, a yv- niz u koji ćemo smjestiti njima odgovarajuće y-koordinate.
Cout ispisuje na ekran: «Unesite broj tačaka kroz koje želite da polinom prođe» .Tada
korisnik sa tastature unese broj tačaka kroz koje hoće da mu polinom prođe.Taj uneseni broj
se smješta u promjenjivu n.
8
}
Na ekran se ispisuje napomena koja upozorava korisnika da treba unijeti samo x-koordinate
za sve tačke. xv=new double[n];-je alokacija dinamičke memorije na Heap-u. Dok for
petlja služi za unos x-koordinata.
double *niz;
int m,j;
Ovdje deklariramo pokazivač na promjenjivu niz tipa double i promjenjive m i j tipa int.
Pokazivač *niz nam je potreban da bi u njega pohranili vrijednosti za koje želimo da
izračunamo P(x). Na ekran nam se ispisuje sljedeća poruka: Unesite broj tačaka za koje želite
izračunati vrijednost polinoma P(x). To znači da korisnik treba da unese broj x-koordinata za
koje želi da izračuna y=f(x) P(x). Nakon što unese broj tačaka i pritisne enter, tada će unijeti
x-koordinate, odgovarajući na upit koji će se pojaviti.
cout<<"\nSa koliko decimala zelite rezultat: ";
cin>>p;
Ova naredba će korisnika upitati sa koliko decimala poslije zareza želi da dobije vrijednosti
P(x) za unešeni x.
newton(niz,xv,yv,n,m,p);
for(i=0;i<n;i++)
for(j=n+1;j>i;j--)
yv[j]=((yv[j]-yv[j-1])/(xv[j]-xv[j-i-1]));
cout<<"\n\n...........Ispis polinoma..............\n\n\n";
9
cout<<"Trazeni polinom ima sljedeci oblik:\n\n";
cout<<" "<<"P(x)="<<yv[0];
for(i=0;i<n-1;i++){
if(yv[i+1]==0); else if(yv[i+1]>0) cout<<"+"<<yv[i+1];
else if(yv[i+1]<0) cout<<yv[i+1];
int m=i;
for(int j=0;j<=m;j++){
if(xv[j]==0) cout<<"x";
else{
cout<<"(x";
if(xv[j]>0) cout<<"-"<<xv[j]<<")";
else cout<<"+"<<((-1)*(xv[j]))<<")";
}
}
}
cout<<"\n\n.....Vrijednost polinoma u zadanim tackama.....\n\n";
for(j=0;j<m;j++){
mult=1.0;
y=yv[0];
for(i=1;i<n;i++)
y+=yv[i]*(mult*=(niz[j]-xv[i-1]));
cout.precision( p );
cout<<" P("<<niz[j]<<")= "<< fixed << y << endl;
}
}
Funkcija newton je tipa void, jer ne vraća nikakvu vrijednost. Njoj su proslijeđeni parametri:
double niz[]-je niz u koji su smještene x-koordinate za koje želimo dobiti P(x).
double xv[]-je niz koji sadrži x-koordinate unesenih tačaka.
double yv[]-je niz koji sadrži y-koordinate unesenih tačaka.
int n –broj tačaka koje su unijete.
int m –broj x-koordinata za koje se želi dobiti P(x).
int p –broj decimalni mjesta poslje zaraza.
for(i=0;i<n;i++)
for(j=n+1;j>i;j--)
yv[j]=((yv[j]-yv[j-1])/(xv[j]-xv[j-i-1]));
Najvažniji dio, a služi za računanje podljeljenih razlika, s tim što se izračunate vrijednosti
spremaju u niz yv i to samo gornji dio tabele podljeljenih razlika.
cout<<"\n\n...........Ispis polinoma..............\n\n\n";
cout<<"Trazeni polinom ima sljedeci oblik:\n\n";
cout<<" "<<"P(x)="<<yv[0];
10
for(i=0;i<n-1;i++){
if(yv[i+1]==0); else if(yv[i+1]>0) cout<<"+"<<yv[i+1];
else if(yv[i+1]<0) cout<<yv[i+1];
int m=i;
for(int j=0;j<=m;j++){
if(xv[j]==0) cout<<"x";
else{
cout<<"(x";
if(xv[j]>0) cout<<"-"<<xv[j]<<")";
else cout<<"+"<<((-1)*(xv[j]))<<")";
}
}
}
Ovaj dio služi za ispis nađenog interpolacionog polinoma na ekran.
for(j=0;j<m;j++){
mult=1.0;
y=yv[0];
for(i=1;i<n;i++)
y+=yv[i]*(mult*=(niz[j]-xv[i-1]));
cout.precision( p );
cout<<" P("<<niz[j]<<")= "<< fixed << y << endl;
}
Ovaj dio računa vrijednost polinoma u zadanim x-koordinatama i ispisuje ga na ekran sa
zadanom preciznošću odnosno brojem decimalnih mjesta poslije zaraza.
Primjeri
Sada ćemo naš program isprobati na nekoliko primjera.Zadane zadatke ćemo rješiti pomoću
našeg koda u Microsoft Visual Studio i kopirati ih.
Rješenje:
a).
11
.....NAPOMENA: Unijeti x-koordinate svih tacaka!....
...........Ispis polinoma..............
P(x)= -28+12(x+3)+2(x+3)x+2(x+3)x(x-2)
P(10)= 2468
Press any key to continue . . .
b).
Unesite broj tacaka,
kroz koje zelite da polinom prode: 5
12
Unesite y-koordinatu 2 tacke: 6
Unesite y-koordinatu 3 tacke: 20
Unesite y-koordinatu 4 tacke: 108
Unesite y-koordinatu 5 tacke: 370
...........Ispis polinoma..............
P(x)= 88-41(x+2)+12(x+2)x+3(x+2)x(x-2)+2(x+2)x(x-2)(x-3)
P(10)= 17356
Press any key to continue . . .
Primjer 2. Za funkciju f(x) datu parovima (2,1), (4,5), (6,10), (8,18) naći približne vrijednosti
f(3) i f(1) koristeći se prvim Newton-ovim interpolacionim polinomom.
Rješenje:
Unesite broj tacaka,
kroz koje zelite da polinom prode: 4
13
Unesite broj tacaka za koje zelite izracunati vrijednost polinoma P(x): 2
...........Ispis polinoma..............
P(x)= 1+1(x-4)+0.375(x-4)(x-6)+0.0833333(x-4)(x-6)(x-8)
P(5)= 1.875
P(3)= -0.125
Press any key to continue . . .
Rješenje:
Unesite broj tacaka,
kroz koje zelite da polinom prode: 4
14
Unesite y-koordinatu 2 tacke: 2.2182
Unesite y-koordinatu 3 tacke: 1.4892
Unesite y-koordinatu 4 tacke: 1.1642
...........Ispis polinoma..............
P(x)= 4.591-11.864(x-0.2)+20.5475(x-0.2)(x-0.4)-25.8292(x-0.2)(x-0.4)(x-0.6)
P(0.3)= 3.122
P(0.5)= 1.726
P(0.7)= 1.354
Primjer 4. Zadane su vrijednosti funkcije f ( x) 3 x 2 4 ln( x) 2 1 u sljedećim tačkama
15
Unesite y-koordinatu 3 tacke: 30.66939
Unesite y-koordinatu 4 tacke: 30.87478
...........Ispis polinoma..............
P(x)= 30.2992+14.735(x-3.13)+377.55(x-3.13)(x-3.14)-15496.7(x-3.13)(x-3.14)(x-3.15)
P(3.1416)= 30.47953
Press any key to continue . . .
Literatura
16