Příklady

 

1. příklad:

 

Funkce f je dána tabulkou ...

 

xi 0 1 2 3
fi 0 3 1 3

 

> k:=4:
    body:=array(1..k,[[0,0],[1,3],[2,1],[3,3]]);

body := vector([[0, 0], [1, 3], [2, 1], [3, 3]])

 

... a naším úkolem je opět najít takový polynom, který by procházel všemi uzlovými body.

Podle předcházejícího postupu zkonstruujeme Newtonův interpolační polynom.

 

Ze zadaných bodů sestrojíme příslušnou soustavu 4 rovnic o 4 neznámých ...

> A:=array(1..k,1..k):
    for i from 1 by 1 to k do
        A[i,1]:=1:
    end do:
    for i from 1 by 1 to k do
        for j from 2 by 1 to k do
            A[i,j]:=0:
        end do:
    end do:
    f(y):=1:
    for j from 2 by 1 to k do
        f(y):=f(y)*(y-body[j-1][1]):
        for i from j by 1 to k do
            A[i,j]:=eval(f(y),y=body[i][1]):
        end do:
    end do:
    eval(A);

matrix([[1, 0, 0, 0], [1, 1, 0, 0], [1, 2, 2, 0], [...

> B:=array(1..k):
    for i from 1 by 1 to k do
        B[i]:=body[i][2]:
    end do:
    eval(B);

vector([0, 3, 1, 3])

 

... a vyřešíme ji.

> a:=linsolve(A,B);

a := vector([0, 3, -5/2, 3/2])

 

Nelezené řešení, tedy koeficienty a1 ... a4 už můžeme dosadit do vzorce ...

> N(x):=sum(a[n]*product((x-body[m][1]),m=1..n-1), n=1..k);

N(x) := 3*x-5/2*x*(x-1)+3/2*x*(x-1)*(x-2)

... a zjednodušit.

> N(x):=expand(N(x));

N(x) := 17/2*x-7*x^2+3/2*x^3

 

Graf opravdu prochází všemi čtyřmi zadanými uzlovými body.

> plots[display]({plot(body,x=body[1][1]..body[k][1],style=point,color=blue),
                            plot(N(x),x=body[1][1]..body[k][1],style=line,color=red)
                           });

[Maple Plot]

 

 

 

2. příklad:

 

Vytvořme si tabulku funkce f(x)  = sin(x) na intervalu <-Pi ; Pi> tak, že ji tabelujeme s krokem Pi/2.

> k:=5:
    body:=[seq([a+i*(b-a)/(k-1),f(a+i*(b-a)/(k-1))],i=0..k-1)];

body := [[-Pi, 0], [-1/2*Pi, -1], [0, 0], [1/2*Pi, ...

 

Z vybraných uzlových bodů vyrobíme příslušnou soustavu 5 rovnic o 5 neznámých ...

> A:=array(1..k,1..k):
    for i from 1 by 1 to k do
        A[i,1]:=1:
    end do:
    for i from 1 by 1 to k do
        for j from 2 by 1 to k do
            A[i,j]:=0:
        end do:
    end do:
    f(y):=1:
    for j from 2 by 1 to k do
        f(y):=f(y)*(y-body[j-1][1]):
        for i from j by 1 to k do
            A[i,j]:=eval(f(y),y=body[i][1]):
        end do:
    end do:
eval(A);

matrix([[1, 0, 0, 0, 0], [1, 1/2*Pi, 0, 0, 0], [1, ...

> B:=array(1..k):
    for i from 1 by 1 to k do
        B[i]:=body[i][2]:
    end do:
    eval(B);

vector([0, -1, 0, 1, 0])

... a vyřešíme.

> a:=linsolve(A,B);

a := vector([0, -2*1/Pi, 4*1/(Pi^2), -8/3*1/(Pi^3),...

Řešení opět dosadíme do vzorce ...

> N(x):=sum(a[n]*product((x-body[m][1]),m=1..n-1), n=1..k);

N(x) := -2/Pi*(x+Pi)+4/Pi^2*(x+Pi)*(x+1/2*Pi)-8/3*1...

... a nakonec ještě zjdnodušíme.

> N(x):=expand(N(x));

N(x) := 8/3/Pi*x-8/3*1/Pi^3*x^3

Graf nalezeného polynomu opravdu v uzlových bodech protíná graf funkce sin(x).

> plots[display]({plot(body,x=body[1][1]..body[k][1],style=point,color=blue),
                             plot(N(x),x=body[1][1]..body[k][1],style=line,color=red),
                             plot(f(x),x=body[1][1]..body[k][1],style=line,color=green)
                          });

[Maple Plot]

 

 

Soubor v Maplu: newton_priklady.mws