Программа аппроксимации табличной функции кубическими сплайнами




Программа аппроксимации табличной функций с помощью интерполяционного полинома Лагранжа

 

Usescrt,graphABC;

Constnmax = 100;

n=20;

Vark,m,i,j: integer;

ct,u:real;

x,y,r,pt:array[1..nmax] of real;

xn,xk,mx,my,f:real;

x0,y0,i1,rad,xc,yc:integer;

s,t:string;

bln: boolean;

begin

SetWindowSize(1200, 800);

y[1]:= -1.84; y[11]:=-1.33;

y[2]:=-1.98; y[12]:=-1.47;

y[3]:=-1.72; y[13]:=-1.50;

y[4]:=-1.58; y[14]:=-2.65;

y[5]:=-1.69; y[15]:=-1.65;

y[6]:=-1.59; y[16]:=-1.87;

y[7]:=-1.58; y[17]:=-1.61;

y[8]:=-1.64; y[18]:=-1.86;

y[9]:=-1.55; y[19]:=-1.84;

y[10]:=-1.35; y[20]:=-1.91;

for i:=1 to 20 do begin

x[i]:=i/10;

end;

writeln('массивузлов:');

for i:=1 to n do

writeln(x[i]:0:2,' ');

writeln;

readln;

writeln('массивзначений:');

for i:=1 to n do

writeln(y[i]:0:2,' ');

writeln;

readln;

for i:=1 to n do R[i]:=0;

for i:=1 to n do

begin

ct:=1;pt[1]:=1;k:=1;

for j:=1 to n do

ifi<>j then

begin

ct:=ct*(x[i]-x[j]);

pt[k+1]:=1;

if k>1 then

for m:=k downto 2 do

pt[m]:=pt[m-1]-pt[m]*x[j];

pt[1]:=-pt[1]*x[j];

k:=k+1;

end;

u:=y[i]/ct;

for m:=1 to n do

r[m]:=r[m]+pt[m]*u;

end;

writeln('массивкоэффициентов:');

for i:=n downto 1 do

begin

writeln(r[i]:0:2,' ');

end;

readln;

clrscr;

x0:=30;{центрэкрана}

y0:=windowheight div 2;

xk:=3;{интервалпоХ}

mx:=(x0+1000)/xk;{масштаб по Х}

my:=y0/7;{по У}

line(0,y0,windowwidth,y0);{оси}

line(x0,0,X0,windowheight);

fori1:=1 to 10 do{максимальное количество засечек в одну сторону}

begin

line(x0+round(i1*mx),y0-3,x0+round(i1*mx),Y0+3); {засечкинаоси Х}

line(x0-round(i1*mx),y0-3,x0-round(i1*mx),Y0+3);

line(x0+3,y0-round(i1*my),x0-3,y0-round(i1*my)); {засечкинаоси Y}

line(x0+3,y0+round(i1*my),x0-3,y0+round(i1*my));

str(i1,s);

{подписьоси Х}

textout(x0+round(i1*mx),y0+10,s);

textout(x0-round(i1*mx),y0+10,'-'+s);

{подписьоси Y}

textout(x0-25,y0-round(i1*my),s);

textout(x0-25,y0+round(i1*my),'-'+s);

end;

{центр}

textout(x0+5,y0+10,'0');

{подписиконцовосей}

textout(windowwidth-10,y0-10,'X');

textout(x0+5,10, 'Y');

{график}

for i:=1 to n do

begin

str(i,t);

rad:= 5;

for xc:= x0+round(x[i]*mx) - rad to x0+round(x[i]*mx) + rad do

foryc:= y0-round(y[i]*my) - rad to y0-round(y[i]*my) + rad do begin

bln:= sqr(xc - (x0+round(x[i]*mx))) + sqr(yc - (y0-round(y[i]*my))) <= sqr(rad);

ifbln then SetPixel(xc, yc, clRed);

end;

TextOut(x0+round(x[i]*mx)+7,y0-round(y[i]*my)-5,t);

end;

end.

 

Результат выполнения программы:


Программа аппроксимации табличной функции кубическими сплайнами

Программа кубических сплайнов

 

usescrt,graphABC;

const n=20;

x0=0.1;

x9=2;

h=0.05;

typevec = array [0..100] of real;

vari,k:integer; x1,p,p1,p2:real;

x,f,c:vec;

procedure tab(n:integer; varx,f:vec);

var i:integer;

begin

for i:=1 to n do begin

x[i]:=i/10;

end;

SetWindowSize(1200, 800);

f[1]:= -1.84; f[11]:=-1.33;

f[2]:=-1.98; f[12]:=-1.47;

f[3]:=-1.72; f[13]:=-1.50;

f[4]:=-1.58; f[14]:=-2.65;

f[5]:=-1.69; f[15]:=-1.65;

f[6]:=-1.59; f[16]:=-1.87;

f[7]:=-1.58; f[17]:=-1.61;

f[8]:=-1.64; f[18]:=-1.86;

f[9]:=-1.55; f[19]:=-1.84;

f[10]:=-1.35; f[20]:=-1.91;

end;

procedurecs(n:integer; varx,f,c:vec);

vari,j,m:integer; a,b,r:real; k:vec;

begin k[1]:=0; c[1]:=0;

for i:=2 to n do begin j:=i-1; m:=j-1;

a:=x[i]-x[j]; b:=x[j]-x[m]; r:=2*(a+b)-b*c[j]; c[i]:=a/r;

k[i]:=(3*((f[i]-f[j])/a-(f[j]-f[m])/b)-b*k[j])/r

end;

c[n]:=k[n];

for i:=n-1 downto 2 do c[i]:=k[i]-c[i]*c[i+1]

end;

procedure sp(n:integer; varx,f,c:vec; var x1,p,p1,p2:real);

vari,j:integer; a,b,d,q,r:real;

begin

i:=1; while (x1>x[i]) and (i<n) do i:=i+1;

j:=i-1; a:=f[j]; b:=x[j]; q:=x[i]-b;

r:=x1-b; p:=c[i]; d:=c[i+1];

b:=(f[i]-a)/q-(d+2*p)*q/3; d:=(d-p)/q*r;

p1:=b+r*(2*p+d); p2:=2*(p+d); p:=a+r*(b+r*(p+d/3))

end;

begin tab(n,x,f);

cs(n,x,f,c); k:=round((x9-x0)/h+1); x1:=x0;

writeln(' x ',' p ');

for i:=1 to k do begin sp(n,x,f,c,x1,p,p1,p2);

writeln(x1,' ',p:2:2); x1:=x1+h;

readln;

end;

end.

Результат выполнения программы:

Программа построения графика функции:
usescrt,graphABC;

const n=20;

x0=0.1;

x9=2;

h=0.05;//изменяя шаг, изменится число точек разбиения

typevec = array [0..100] of real;

vari,k:integer; x1,p,p1,p2:real;

xn,xk,mx,my,ct,u:real;

 

x00,y00,i1,rad,xc,yc:integer;

s,t:string;

bln: boolean;

x,f,c:vec;

procedure tab(n:integer; varx,f:vec);

var i:integer;

begin

for i:=1 to n do begin

x[i]:=i/10;

end;

SetWindowSize(1200, 800);

f[1]:= -1.84; f[11]:=-1.33;

f[2]:=-1.98; f[12]:=-1.47;

f[3]:=-1.72; f[13]:=-1.50;

f[4]:=-1.58; f[14]:=-2.65;

f[5]:=-1.69; f[15]:=-1.65;

f[6]:=-1.59; f[16]:=-1.87;

f[7]:=-1.58; f[17]:=-1.61;

f[8]:=-1.64; f[18]:=-1.86;

f[9]:=-1.55; f[19]:=-1.84;

f[10]:=-1.35; f[20]:=-1.91;

clrscr;

x00:=30;{центрэкрана}

y00:=windowheight div 2;

xk:=3;{интервал по Х}

mx:=(x00+1000)/xk;{масштаб по Х}

my:=y00/7;{поУ}

line(0,y00,windowwidth,y00);{оси}

line(x00,0,X00,windowheight);

for i1:=1 to 10 do{максимальное количество засечек в одну сторону}

begin

line(x00+round(i1*mx),y00-3,x00+round(i1*mx),Y00+3); {засечкинаосиХ}

line(x00-round(i1*mx),y00-3,x00-round(i1*mx),Y00+3);

line(x00+3,y00-round(i1*my),x00-3,y00-round(i1*my)); {засечкинаоси Y}

line(x00+3,y00+round(i1*my),x00-3,y00+round(i1*my));

str(i1,s);

{подписьосиХ}

textout(x00+round(i1*mx),y00+10,s);

textout(x00-round(i1*mx),y00+10,'-'+s);

{подписьоси Y}

textout(x00-25,y00-round(i1*my),s);

textout(x00-25,y00+round(i1*my),'-'+s);

end;

{центр}

textout(x00+5,y00+10,'0');

{подписиконцовосей}

textout(windowwidth-10,y00-10,'X');

textout(x00+5,10, 'Y');

 

 

end;

procedurecs(n:integer; varx,f,c:vec);

vari,j,m:integer; a,b,r:real; k:vec;

begin k[1]:=0; c[1]:=0;

for i:=2 to n do begin j:=i-1; m:=j-1;

a:=x[i]-x[j]; b:=x[j]-x[m]; r:=2*(a+b)-b*c[j]; c[i]:=a/r;

k[i]:=(3*((f[i]-f[j])/a-(f[j]-f[m])/b)-b*k[j])/r

end;

c[n]:=k[n];

for i:=n-1 downto 2 do c[i]:=k[i]-c[i]*c[i+1]

end;

procedure sp(n:integer; varx,f,c:vec; var x1,p,p1,p2:real);

vari,j:integer; a,b,d,q,r:real;

begin

i:=1; while (x1>x[i]) and (i<n) do i:=i+1;

j:=i-1; a:=f[j]; b:=x[j]; q:=x[i]-b;

r:=x1-b; p:=c[i]; d:=c[i+1];

b:=(f[i]-a)/q-(d+2*p)*q/3; d:=(d-p)/q*r;

p1:=b+r*(2*p+d); p2:=2*(p+d); p:=a+r*(b+r*(p+d/3))

end;

begin tab(n,x,f);

cs(n,x,f,c); k:=round((x9-x0)/h+1); x1:=x0;

for i:=1 to k do begin sp(n,x,f,c,x1,p,p1,p2); x1:=x1+h;

begin

{график}

str(i,t);

rad:= 5;

for xc:= x00+round(x1*mx) - rad to x00+round(x1*mx) + rad do

foryc:= y00-round(p*my) - rad to y00-round(p*my) + rad do begin

bln:= sqr(xc - (x00+round(x1*mx))) + sqr(yc - (y00-round(p*my))) <= sqr(rad);

ifbln then SetPixel(xc, yc, clRed);

end;

TextOut(x00+round(x1*mx)+7,y00-round(p*my)-5,t);

end;

end;

end.

 

 

Результаты работы программы:



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: