21
Bisection Method program bisection_method; var x1,x2,x3:real; acc:integer; function f(t:real):real; begin f:=t*t*t-t-1; {the required function goes here. in this case it's f(x)= x^3 - x - 1 } end; begin writeln('Bisection method'); writeln('enter the 1st start value: '); readln(x1); writeln('enter the 2nd start value: '); readln(x2); if (f(x1)*f(x2)>0) or (f(x1)=f(x2)) then writeln('Invalid starting points') else begin writeln('to how many decimal places? '); readln(acc); if f(x1)=0 then begin x2:=x1;x3:=x1;end; if f(x2)=0 then begin x1:=x2;x3:=x2;end; while abs(f(x1)-f(x2))>1/exp(acc*(ln(10))) do begin x3:=(x1+x2)/2; if f(x3)*f(x2)>=0 then x2:=x3; if f(x3)*f(x1)>=0 then x1:=x3; end; writeln('The answer is: ',x3:5:acc+1); end; readln; end. Back to list of programs

Program Metode Numerik

Embed Size (px)

DESCRIPTION

metode numerik

Citation preview

Bisection Method

Bisection Method

program bisection_method;

var

x1,x2,x3:real;

acc:integer;

function f(t:real):real;

begin

f:=t*t*t-t-1;

{the required function goes here. in this case it's

f(x)= x^3 - x - 1 }

end;

begin

writeln('Bisection method');

writeln('enter the 1st start value: ');

readln(x1);

writeln('enter the 2nd start value: ');

readln(x2);

if (f(x1)*f(x2)>0) or (f(x1)=f(x2)) then

writeln('Invalid starting points')

else

begin

writeln('to how many decimal places? ');

readln(acc);

if f(x1)=0 then begin x2:=x1;x3:=x1;end;

if f(x2)=0 then begin x1:=x2;x3:=x2;end;

while abs(f(x1)-f(x2))>1/exp(acc*(ln(10))) do

begin

x3:=(x1+x2)/2;

if f(x3)*f(x2)>=0 then x2:=x3;

if f(x3)*f(x1)>=0 then x1:=x3;

end;

writeln('The answer is: ',x3:5:acc+1);

end;

readln;

end.

Back to list of programs

Regula Falsi (False Postion) Method

program false_position;

var

x1,x2,x3:real;

acc:integer;

function f(t:real):real;

begin

f:=t*t*t-2*t-5;

{the required function goes here. in this case it's

f(x)= x^3 - 2x - 5 }

end;

begin

writeln('False Position method');

writeln('enter the 1st start value: ');

readln(x1);

writeln('enter the 2nd start value: ');

readln(x2);

if (f(x1)*f(x2)>0) or (f(x1)=f(x2)) then

writeln('Invalid starting points')

else

begin

writeln('to how many decimal places? ');

readln(acc);

if f(x1)=0 then begin x2:=x1;x3:=x1;end;

if f(x2)=0 then begin x1:=x2;x3:=x2;end;

while (abs(f(x1))>1/exp(acc*(ln(10)))) and (abs(f(x2))>1/exp(acc*(ln(10)))) do

begin

x3:=x1-f(x1)*(x2-x1)/(f(x2)-f(x1));

if f(x3)*f(x2)>=0 then x2:=x3;

if f(x3)*f(x1)>=0 then x1:=x3;

end;

writeln('The answer is: ',x3:5:acc+1);

end;

readln;

end.

Back to list of programs

Newton-Raphson Method

program newton_rhapson;

var

x1:real;

acc:integer;

function f(t:real):real;

begin

f:=t*sin(t)+cos(t);

end;

function fd(t:real):real;

begin

fd:=t*cos(t);

end;

begin

writeln('Newton-Rhapson method');

writeln('enter the start value: ');

readln(x1);

if fd(x1)=0 then

writeln('Invalid starting points')

else

begin

writeln('to how many decimal places? ');

readln(acc);

while (abs(f(x1))>1/exp(acc*(ln(10)))) do

begin

x1:=x1-f(x1)/fd(x1);

end;

writeln('The answer is: ',x1:5:acc+1);

end;

readln;

end.

Back to list of programs

Secant Method

program secant;

var

x1,x2,x3:real;

acc:integer;

function f(t:real):real;

begin

f:=t*t*t-2*t*t+t+10;

end;

begin

writeln('Secant method');

writeln('enter the 1st start value: ');

readln(x1);

writeln('enter the 2nd start value: ');

readln(x2);

if f(x1)=f(x2) then

writeln('Invalid starting points')

else

begin

writeln('to how many decimal places? ');

readln(acc);

while (abs(f(x2))>1/exp(acc*(ln(10)))) do

begin

x3:=(x1*f(x2)-x2*f(x1)) / (f(x2)-f(x1));

x1:=x2;x2:=x3;

end;

writeln('The answer is: ',x3:5:acc+1);

end;

readln;

end.

Back to list of programs

Gauss Elimination Method

program gauss_elimination;

uses crt;

const MAXX=4;

const MAXEQNS=MAXX; {MAXEQNS should be = MAXX}

const SIGPLACES=4;

const DECPLACES=4;

var a:array[1..MAXEQNS,1..MAXX+1] of real;

x:array[1..MAXX] of real;

i,j,k:integer;

temp:real;

begin

clrscr;

{write the equations in general form}

for i:=1 to MAXEQNS do

begin

for j:=1 to MAXX do

begin

write('a',i,j,'.x',j);

if j < MAXX then write(' + ');

end;

writeln(' = b',i);

end;

{get the values of a[i,j]}

for i:=1 to MAXEQNS do

begin

for j:=1 to MAXX do

begin

write('enter a',i,j,' ');

readln(a[i,j]);

end;

write('enter b',i,' ');

readln(a[i,MAXX+1]);

end;

readln;

clrscr;

{write the given eqns}

for i:=1 to MAXEQNS do

begin

for j:=1 to MAXX do

begin

write(a[i,j]:SIGPLACES:DECPLACES,' x',j);

if j < MAXX then write(' + ');

end;

writeln(' = ',a[i,MAXX+1]:SIGPLACES:DECPLACES);

end;

{calculate the output matrix}

for i:=1 to MAXEQNS-1 do

for j:=i+1 to MAXEQNS do

begin

temp:=a[j,i];

for k:=1 to MAXX+1 do

a[j,k]:=a[j,k] - temp*a[i,k]/a[i,i];

end;

{calc the values of x1 x2 etc}

x[MAXEQNS] := a[MAXEQNS,MAXX+1] / a[MAXEQNS,MAXX];

for i:=MAXEQNS downto 1 do

begin

x[i]:=a[i,MAXX+1];

for j:=i+1 to MAXX do

begin

x[i]:=x[i] - a[i,j]*x[j];

end;

x[i]:=x[i]/a[i,i];

end;

{answers}

writeln;

for i:=1 to MAXX do

write('x',i,' = ',x[i]:SIGPLACES:DECPLACES,' ');

readln;

end.

Back to list of programs

Gauss-Seidel Method

program gauss_seidel;

uses crt;

const MAXX=4;

const MAXEQNS=MAXX; {MAXEQNS should be = MAXX}

const SIGPLACES=4;

var a:array[1..MAXEQNS,1..MAXX+1] of real;

x:array[1..MAXX] of real;

fl:array[1..MAXX] of integer;

max:real;

i,j,acc,flag:integer;

procedure iterate;

var k,m:integer;

xtemp:real;

begin

flag:=0;

for k:=1 to MAXEQNS do

begin

xtemp:=x[k];

x[k]:=a[k,MAXX+1] / a[k,k];

for m:=1 to MAXX do

if km then x[k]:=x[k] - a[k,m]/a[k,k]*x[m];

write(x[k]:SIGPLACES:acc,' ');

if abs(xtemp-x[k]) < 1/(exp(acc*ln(10))) then fl[k]:=1;

end;

writeln;

for k:=1 to MAXX do if fl[k]=1 then flag:=flag+1

end; {proc iterate}

begin {main()}

clrscr;

{write the equations in general form}

for i:=1 to MAXEQNS do

begin

for j:=1 to MAXX do

begin

write('a',i,j,'.x',j);

if j < MAXX then write(' + ');

end;

writeln(' = b',i);

end;

{get the values of a[i,j]}

for i:=1 to MAXEQNS do

begin

max:=-99999999;

for j:=1 to MAXX do

begin

write('enter a',i,j,' ');

readln(a[i,j]);

if a[i,j]>max then max:=a[i,j];

end;

if a[i,i]max then

begin

writeln;

writeln('please restart and re-enter the equations ');

writeln('such that the max coefficient in each row ');

writeln('is the a(i,i) value');

readln;

halt;

end;

write('enter b',i,' ');

readln(a[i,MAXX+1]);

end;

readln;

clrscr;

write('enter the number of decimal places to which you want the answer: ');

readln(acc);

writeln;

writeln('the given equations are:');

writeln;

{write the given eqns}

for i:=1 to MAXEQNS do

begin

for j:=1 to MAXX do

begin

write(a[i,j]:SIGPLACES:acc,' x',j);

if j < MAXX then write(' + ');

end;

writeln(' = ',a[i,MAXX+1]:SIGPLACES:acc);

end;

readln;

clrscr;

{seed}

flag:=0;

for i:=1 to MAXX do

begin

x[i]:=0;

fl[i]:=0;

end;

{iterate}

while flag < MAXX do iterate;

readln;

clrscr;

for i:=1 to MAXX do

writeln('x',i,' = ',x[i]);

readln;

end.

Back to list of programs

Jacobi Method

program jacobi;

uses crt;

const MAXX=4;

const MAXEQNS=MAXX; {MAXEQNS should be = MAXX}

const SIGPLACES=4;

var a:array[1..MAXEQNS,1..MAXX+1] of real;

x:array[1..MAXX] of real;

i,j,acc,flag:integer;

procedure iterate;

var xtemp:array[1..MAXX] of real;

k,m:integer;

begin

for k:=1 to MAXEQNS do

begin

xtemp[k]:=a[k,MAXX+1] / a[k,k];

for m:=1 to MAXX do

if km then xtemp[k]:=xtemp[k] - a[k,m]/a[k,k]*x[m];

write(xtemp[k]:SIGPLACES:acc,' ');

if abs(xtemp[k]-x[k]) < 1/(exp(acc*ln(10))) then flag:=flag+1;

end;

writeln;

for k:=1 to MAXX do x[k]:=xtemp[k];

end; {proc iterate}

begin

clrscr;

{write the equations in general form}

for i:=1 to MAXEQNS do

begin

for j:=1 to MAXX do

begin

write('a',i,j,'.x',j);

if j < MAXX then write(' + ');

end;

writeln(' = b',i);

end;

{get the values of a[i,j]}

for i:=1 to MAXEQNS do

begin

for j:=1 to MAXX do

begin

write('enter a',i,j,' ');

readln(a[i,j]);

end;

write('enter b',i,' ');

readln(a[i,MAXX+1]);

end;

readln;

clrscr;

write('enter the number of decimal places to which you want the answer: ');

readln(acc);

writeln;

writeln('the given equations are:');

writeln;

{write the given eqns}

for i:=1 to MAXEQNS do

begin

for j:=1 to MAXX do

begin

write(a[i,j]:SIGPLACES:acc,' x',j);

if j < MAXX then write(' + ');

end;

writeln(' = ',a[i,MAXX+1]:SIGPLACES:acc);

end;

readln;

clrscr;

{seed}

x[1]:=a[1,MAXX+1] / a[1,1];

for i:=2 to MAXX do x[i]:=0;

{iterate}

flag:=0;

while flag < MAXX do iterate;

readln;

clrscr;

for i:=1 to MAXX do

writeln('x',i,' = ',x[i]:SIGPLACES:acc);

readln;

end.

Back to list of programs

Newton's Forward Difference Interpolation Method

program forward_diff;

const SIGPLACES=4;

DECPLACES=4;

MAXDATA=100;

MAXDELS=10;

var

n,i,j:integer;

x:array[1..MAXDATA] of real;

y:array[1..MAXDATA,1..MAXDELS] of real;

r,xn,yn,h:real;

function fact(num:longint):longint;

begin

if num>0 then fact:=num*fact(num-1) else fact:=1;

end;

function mult(num:real;subtract:integer):real;

begin

if subtract>0 then mult:=(num-subtract)*mult(num,subtract-1) else mult:=num;

end;

begin

write('how many data points? ');

readln(n);

write('enter starting value of x: ');

readln(x[1]);

write('enter the x interval: ');

readln(h);

for i:=1 to n do

begin

x[i]:=x[1]+(i-1)*h;

write('enter y',i,': ');

readln(y[i,1]);

end;

write('what value of x do you want y for? ');

readln(xn);

for j:=2 to MAXDELS do

begin

for i:=1 to j do y[i,j]:=0;

for i:=j to n do

y[i,j]:=y[i,j-1]-y[i-1,j-1];

end;

for i:=1 to n do

begin

write(x[i]:SIGPLACES:DECPLACES,' ');

for j:=1 to i do

write(y[i,j]:SIGPLACES:DECPLACES,' ');

writeln;

end;

writeln;writeln;

yn:=y[1,1];

r:=(xn-x[1])/h;

for i:=2 to MAXDELS do

yn:=yn+mult(r,i-2)/fact(i-1)*y[i,i];

writeln('answer: ',yn:SIGPLACES:DECPLACES);

readln;

end.

Back to list of programs

Newton's Backward Difference Interpolation Method

program backward_diff;

uses crt;

const SIGPLACES=4;

DECPLACES=4;

MAXDATA=100;

MAXDELS=10;

var

n,i,j:integer;

x:array[1..MAXDATA] of real;

y:array[1..MAXDATA,1..MAXDELS] of real;

r,xn,yn,h:real;

function fact(num:longint):longint;

begin

if num>0 then fact:=num*fact(num-1) else fact:=1;

end;

function mult(num:real;subtract:integer):real;

begin

if subtract>0 then mult:=(num+subtract)*mult(num,subtract-1) else mult:=num;

end;

begin

clrscr;

write('how many data points? ');

readln(n);

write('enter starting value of x: ');

readln(x[1]);

write('enter the x interval: ');

readln(h);

for i:=1 to n do

begin

x[i]:=x[1]+(i-1)*h;

write('enter y',i,': ');

readln(y[i,1]);

end;

write('what value of x do you want y for? ');

readln(xn);

for j:=2 to MAXDELS do

begin

for i:=1 to j do y[i,j]:=0;

for i:=j to n do

y[i,j]:=y[i,j-1]-y[i-1,j-1];

end;

for i:=1 to n do

begin

write(x[i]:SIGPLACES:DECPLACES,' ');

for j:=1 to i do

write(y[i,j]:SIGPLACES:DECPLACES,' ');

writeln;

end;

writeln;writeln;

yn:=y[n,1];

r:=(xn-x[n])/h;

for i:=2 to MAXDELS do

yn:=yn+mult(r,i-2)/fact(i-1)*y[n,i];

writeln('answer: ',yn:SIGPLACES:DECPLACES);

readln;

end.

Back to list of programs

Newton's Divided Difference Interpolation Method

program div_diff;

uses crt;

const SIGPLACES=4;

DECPLACES=4;

MAXDATA=100;

MAXDELS=10;

var

n,i,j:integer;

x:array[1..MAXDATA] of real;

y:array[1..MAXDATA,1..MAXDELS] of real;

xn,yn:real;

function mult(k:integer):real;

begin

if k>1 then mult:=mult(k-1)*(xn-x[k]) else mult:=xn-x[1];

end;

begin

clrscr;

write('how many data points? ');

readln(n);

for i:=1 to n do

begin

write('enter x',i,': ');

readln(x[i]);

write('enter y',i,': ');

readln(y[i,1]);

end;

readln;

clrscr;

write('what value of x do you want y for? ');

readln(xn);

{calc the divdiff table}

for j:=2 to MAXDELS do

begin

for i:=1 to j do y[i,j]:=0;

for i:=j to n do

y[i,j]:=(y[i,j-1]-y[i-1,j-1]) / (x[i]-x[i-j+1]);

end;

{show the table}

for i:=1 to n do

begin

write(x[i]:SIGPLACES:DECPLACES,' ');

for j:=1 to i do

write(y[i,j]:SIGPLACES:DECPLACES,' ');

writeln;

end;

writeln;writeln;

yn:=y[1,1];

for i:=2 to MAXDELS do

yn:=yn+mult(i-1)*y[i,i];

writeln('answer: ',yn:SIGPLACES:DECPLACES);

readln;

end.

Back to list of programs

Euler's Method

program euler; {for diff eqns}

uses crt;

const SIGPLACES=4;

DECPLACES=4;

MAXDATA=100;

var x,y:array[0..MAXDATA] of real;

h,xn:real;

i:integer;

function f(x:real;y:real):real;

begin

f:=x+2*y; {given function}

end;

begin

clrscr;

write('enter x0: '); readln(x[0]);

write('enter y0: '); readln(y[0]);

write('enter the interval h: '); readln(h);

write('enter the value of x for which y is required (xn): ');

readln(xn);

i:=0;

repeat

begin

i:=i+1;

x[i]:=x[0]+i*h;

y[i]:=y[i-1] + (h * f(x[i-1],y[i-1]));

writeln(x[i]:SIGPLACES:DECPLACES,' ',y[i]:SIGPLACES:DECPLACES);

end;

until ((i=MAXDATA) or (x[i]=xn));

if (i=MAXDATA) and (x[i]xn) then

writeln('Insufficient storage space, or h is not the correct size to reach xn')

else

writeln('answer is: ',y[i]:SIGPLACES:DECPLACES);

readln;

end.

Back to list of programs

Euler's Modified Method (Predictor-Corrector formula)

program modified_euler; {for diff eqns}

uses crt;

const SIGPLACES=4;

DECPLACES=4;

MAXDATA=100;

var x,y:array[0..MAXDATA] of real;

h,xn:real;

i:integer;

function f(x:real;y:real):real;

begin

f:=x+3*y; {given function}

end;

begin

clrscr;

write('enter x0: '); readln(x[0]);

write('enter y0: '); readln(y[0]);

write('enter the interval h: '); readln(h);

write('enter the value of x for which y is required (xn): '); readln(xn);

i:=0;

repeat

begin

i:=i+1;

y[i]:=y[i-1] + (h * f(x[i-1],y[i-1]));

x[i]:=x[i-1]+h;

y[i]:=y[i-1] + (h/2) * ( f(x[i-1],y[i-1])+f(x[i],y[i]) );

writeln(xn:SIGPLACES:DECPLACES,' ',y[i]:SIGPLACES:DECPLACES);

end;

until (x[0]+(i*h)=xn);

writeln('answer is: ',y[i]:SIGPLACES:DECPLACES);

readln;

end.

Back to list of programs

Runge-Kutta 4th Order Method

program runge_kutta_4th;

uses crt;

const SIGPLACES=4;

DECPLACES=4;

MAXDATA=100;

var x,y:array[0..MAXDATA] of real;

i,n:integer;

k1,k2,k3,k4,h,xn:real;

function f(x:real;y:real):real;

begin

f:=-y; { given function y = e^(-x) }

end;

begin

clrscr;

write('enter the first x value (x0): '); readln(x[0]);

write('enter the x value for which y is required (xn): '); readln(xn);

write('enter the step value (h): '); readln(h);

i:=0;

repeat

begin

k1:=h * f(x[i],y[i]);

k2:=h * f(x[i]+h/2,y[i]+k1/2);

k3:=h * f(x[i]+h/2,y[i]+k2/2);

k4:=h * f(x[i]+h,y[i]+k3);

i:=i+1;

x[i]:=x[0]+h*i;

y[i]:=y[i-1] + (k1+2*(k2+k3)+k4)/6;

writeln(x[i]:SIGPLACES:DECPLACES,' ',y[i]:SIGPLACES:DECPLACES);

end;

until ((i=MAXDATA) or (x[i]=xn));

if (i=MAXDATA) and (x[i]xn) then

writeln('Insufficient storage space, or h is not the correct size to reach xn')

else

writeln('answer is: ',y[i]:SIGPLACES:DECPLACES);

readln;

end.

Back to list of programs

Trapezoidal Method

program trapezoidal;

uses crt;

const SIGPLACES=4;

DECPLACES=4;

var x1,xn,h,sum:real;

i:integer;

function f(x:real):real;

begin

f:=1/(1+x);

end;

begin

clrscr;

writeln('Trapezoidal method of numerical integration');

write('what is the starting value of x? ');

readln(x1);

write('what is the ending value of x? ');

readln(xn);

write('enter the interval h: ');

readln(h);

sum:=f(x1)+f(xn);

i:=1;

repeat

begin

i:=i+1;

sum:=sum+2*f(x1+(i-1)*h);

end;

until (x1+i*h = xn);

writeln('answer is ',h*sum/2:SIGPLACES:DECPLACES);

readln;

end.

Back to list of programs

Simpson's 3/8th Rule Method

program simpson_3_8th;

uses crt;

const SIGPLACES=4;

DECPLACES=4;

MAXDATA=100;

var y:array[0..MAXDATA] of real;

h,sum:real;

i,n:integer;

{i: counter, n:number of ordinates, h:common diff}

begin

clrscr;

write('how many data points? ');

readln(n);

if ((n-1) mod 3)0 then {check if numdatapoints=3m+1}

writeln('number of data points must be 3n+1')

else

begin

write('enter the common difference h: ');

readln(h);

for i:=0 to n-1 do

begin

write('enter y',i,': '); readln(y[i]);

end;

sum:=y[0]+y[n-1];

for i:=1 to n-2 do

if i/3=int(i/3) then sum:=sum+2*y[i] else sum:=sum+3*y[i];

writeln('answer is: ',3*h*sum/8:SIGPLACES:DECPLACES);

end;

readln;

end.