четвер, 8 березня 2018 р.

Алгоритми табуляції та інтерполяції поліномами

Практична робота 16 «Алгоритми табуляції властивостей поліномів на мові Pascal»
Завдання 1. Скласти і реалізувати алгоритм  для знаходження   табулювання значень квадратичної функції, що задана рекурсивною формулою у=(а1х2)х3= а1х22х3.
program  Quadratfunction;                     {назва    алгоритму  табуляції}
var  a1, a2, a3, x, y, d, x1, x2,y1: real;      i, k: integer;     {оголошення  змінних: дійсні числа та цілі числа}
begin           {початок   виконання алгоритму і введення випадкових коефіцієнтів  квадратичної функції}
 a1:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 1+random(3) ;   
writeln( ' Якщо cтарший коефіцієнт квадратичної функції a1=', a1); writeln;
a2:=2+random(7) *(-1+random(3)); 
writeln(' Якщо лінійний коефіцієнт квадратичної функції a2=', a2); writeln;
a3:= (4+random(10))*(-1)*(-1+random(3));
writeln(' Якщо вільний коефіцієнт квадратичної функції:  y(0)=a3=', a3); writeln;
writeln(' Якщо cума коефіцієнтів квадратичної функції:  y(1)=a1+a2+a3=', a1+a2+a3); writeln;
x:=-(1+random(20));  writeln(' Якщо початковий аргумент квадратичної функції x=', x); writeln;
d:=1+random(3);  writeln( ' Якщо величина кроку табуляції  квадратичної функції d=', d); writeln;
k:=5+random(8);  writeln( ' Якщо кількість кроків табуляції k=', k); writeln;
for i:=1 to k do begin       {виконання циклу з лічильником по kрокам для обчислення  значень функції}
x:=x+(i-1)*d;    y:=(a1*x+a2)*x+a3;       { виведення результатів табулювання на  екран монітора}
writeln( ' номер кроку табуляції  i=', i,  ' аргумент функції  х=', x, ' значення функції  y=', y); writeln; end; writeln('********'); writeln( ' квадратична функція має вигляд у=', a1,  '*x*x+( ' ,  a2,  ' )x+( ',  a3,  ' )' );  
d:=a2*a2-4*a1*a3;
 if (d>0)  or (d=0)  then   {обчислення  дискримінанта  перевірка  його знаку  для квадратичної функції}
begin   x:=0.5*(-a2-sqrt(d))/a1;  y:=abs((a1*x+a2)*x+a3);   x1:=x;   {обчислення  першого нуля квадратичної функції}
writeln( ' перший наближений  нуль квадратичної функції  х1=', x, 'з абсолютною похибкою ',y); writeln;
x:=0.5*(-a2+sqrt(d))/a1;   y:=abs((a1*x+a2)*x+a3);  x2:=x;{ {обчислення  другого нуля квадратичної функції}
writeln( ' другий наближений нуль квадратичної функції  х2=', x, 'з абсолютною похибкою ',y); writeln; end 
else   writeln( ' немає нулів квадратична функція');
x:=0.5*(-a2)/a1;  y:=(a1*x+a2)*x+a3;   y1:=y;                              {обчислення  координат вершини параболи  }
if (a1>0)  then                         {оголошення  мінімуму  квадратичної функції як координат вершини параболи}
   writeln( 'гілки параболи напрямлені вгору,  мінімум квадратичної функції якщо  Хmin=', x, '  та Уmin= ',y
else                                          {оголошення  максимуму  квадратичної функції як координат вершини параболи}
writeln( 'гілки параболи напрямлені вниз,   максимум квадратичної функції якщо  Хmах=',x, '  та Уmах= ',y); writeln; 
writeln( 'вісь симетрії графіка параболи  це вертикальна пряма лінія: Хвісь=', -0.5*a2/a1); writeln;
if (a1>0)  then  writeln(' функція зростає, якщо  Х>', -0.5*a2/a1); writeln; 
if (a1>0)  then  writeln(' функція спадає, якщо  Х<', -0.5*a2/a1); writeln; 
if (a1>0) and (d>0)  then  writeln(' функція додатна, якщо  Х<', x1, ' та Х>', x2); writeln; 
if (a1>0) and (d>0)   then  writeln(' функція відємна, якщо  ХЄ(', x1, ' ;', x2, ') ' ); writeln; 
if (a1<0) and (d>0)   then  writeln(' функція відємна, якщо  Х<', x1, ' та Х>', x2); writeln; 
if (a1<0) and (d>0)   then  writeln(' функція додатна, якщо  ХЄ(', x1, ' ;', x2, ') ' ); writeln; 
if (a1<0)  then  writeln(' функція зростає, якщо  Х<', -0.5*a2/a1); writeln; 
if (a1<0)  then  writeln(' функція спадає, якщо  Х>', -0.5*a2/a1); writeln;
if (a2=0)  then  writeln( 'Квадратична функція  у=', a1,  '*x*x+( ' ,  a2,  ' )x+( ',  a3,  ' ) парна.') else  
writeln( 'Квадратична функція  у=', a1,  '*x*x+( ' ,  a2,  ' )x+( ',  a3,  ' ) ні парна, ні непарна.'); writeln; 
writeln( 'Обернена функція до першої гілки параболи квадратичної функції:  у1=+((x-(', y1,  '))/ (',  a1, '))^0.5 +(',  -0.5*a2/a1, ')'); writeln; 
writeln( 'Обернена функція до другої гілки параболи квадратичної функції:  у2=-((x-(', y1,  '))/( ',  a1, '))^0.5 +(',  -0.5*a2/a1, ')'); writeln; 
writeln( ' Немає перегинів випуклих ділянок квадратична функція');
   end.   {закінчення алгоритму}
Протестуйте алгоритм  чотири рази та порівняйте результати табуляції і виберіть той варіант, при якому можна знайти найточніше наближення   нулів квадратичної функції, тобто випадок y:=(a1*x+a2)*x+a3=0.       
Завдання 2. Скласти і реалізувати алгоритм  для знаходження   табулювання значень кубічної функції, що задана рекурсивною формулою у=(1х2)х3)х+a4.
program  Cubesfunction;                     {назва    алгоритму  табуляції}
var  a1, a2, a3, a4,  x, y, d: real;      i, k: integer;     {оголошення  змінних величин: дійсні числа та цілі числа}
begin           { початок   виконання алгоритму і введення випадкових коефіцієнтів  кубічної функції}
 a1:=1+random(3);  writeln( ' Якщо cтарший коефіцієнт кубічної функції a1=', a1); writeln;
a2:=2+random(7);  writeln(' Якщо квадратичний коефіцієнт кубічної функції a2=', a2); writeln;
a3:=-(4+random(10));  writeln(' Якщо лінійний коефіцієнт кубічної функції a3=', a3); writeln;
a4:=-(3+random(10));  writeln(' Якщо вільний коефіцієнт кубічної функції a4=', a4); writeln;
x:=-(1+random(20));  writeln(' Якщо початковий аргумент кубічної функції x=', x); writeln;
d:=1+random(3);  writeln( ' Якщо величина кроку табуляції  кубічної функції d=', d); writeln;
k:=15+random(5);  writeln( ' Якщо кількість кроків табуляції k=', k); writeln;
for i:=1 to k do begin       {виконання циклу з лічильником по kрокам для обчислення  значень функції}
x:=x+(i-1)*d;    y:=((a1*x+a2)*x+a3)+a4;       { виведення результатів табулювання на  екран монітора}
writeln( ' номер кроку табуляції  i=', i,  ' аргумент функції  х=', x, ' значення функції  y=', y); writeln; end; writeln('********'); end.   {закінчення алгоритму}

Протестуйте алгоритм  чотири рази та порівняйте результати табуляції і виберіть той варіант, при якому можна знайти найточніше наближення   нулів кубічної функції, тобто випадок ((a1*x+a2)*x+a3)*x+a4=0.       



Практична робота 20. «Алгоритми інтерполяції квадратними поліномами трьох точкової статистики на мові Pascal»
Завдання 1. Створити алгоритм який за трьома відомими точками в прямокутній  системі координат генерує формулу квадратичної функції використовуючи розв’язання  системи 3-х рівнянь з трьома невідомими методом Крамера. Ця задача називається «інтерполяція квадратичними поліномами» або знаходження «квадратичного тренду».
Розв’язання.  Випадковим чином задаються три точки деякої статистики:  (х1; у1), (х2; у2), (х3; у3). Вважається, що ці три точки належать деякій параболі,  що записується  формулою вигляду: у=ах2+bx+c.  Підставляємо кожну точку у формулу і отримуємо систему трьох рівнянь з трьома невідомими а, b, c. 
{| aх1*х1 + bх1 + c * 1 = y1 | }
{| aх2*х2 + bх2 + c * 1 = y2 }
{| aх3*х3 + bх3 + c * 1 = y1 }
Розв’язуємо систему відносно  а, b, c  за допомогою метода визначників (метод Крамера).
Program  Interpoljacia;
var a1, a2, a3, b1, b2, b3, c1, c2, c3, d1, d2, d3, x, y, z, e, ex, ey, ez, x1, x2, x3, y1, y2, y3: real;
begin
x1:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 1+random(3) ; 
y1:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 2+random(3) ;   
writeln( ' Якщо перша точка, що належить квадратичній функції х1=', x1, 'y1=', y1); writeln;
x2:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 1+random(3) ; 
y2:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 3+random(3) ;   
writeln( ' Якщо друга точка, що належить квадратичній функції х2=', x2, 'y2=', y2); writeln;
x3:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 1+random(3) ; 
y3:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 4+random(3) ;   
writeln( ' Якщо третя точка, що належить квадратичній функції х3=', x3, 'y3=', y3); writeln;
a1:= x1*x1;    a2:= x2*x2;  a3:= x3*x3;   b1:= x1;    b2:= x2;  b3:= x3;  c1:=1;    c2:=1;  c3:=1;
d1:=y1;   d2:=y2;  d3:=y3;
 e:= (a1 * b2 * c3 + b1 * c2 * a3 + c1 * a2 * b3-a3 * b2 * c1-b3 * c2 * a1-c3 * a2 * b1);
 ex:=(d1 * b2 * c3 + b1 * c2 * d3 + c1 * d2 * b3-d3 * b2 * c1-b3 * c2 * d1-c3 * d2 * b1);
 ey:=(a1 * d2 * c3 + d1 * c2 * a3 + c1 * a2 * d3-a3 * d2 * c1-d3 * c2 * a1-c3 * a2 * d1);
 ez:=(a1 * b2 * d3 + b1 * d2 * a3 + d1 * a2 * b3-a3 * b2 * d1-b3 * d2 * a1-d3 * a2 * b1);
 if (e=0) and ((ex=0) or (ey=0) or (ez=0)) then
    writeln ( 'безліч рішень')
 else if (e <> 0) and ((ex = 0) or (ey = 0) or (ez = 0)) then
    writeln ( 'немає рішень')
 else begin
    x:=ex/e;     y:=ey/e;     z:=ez/e;
writeln ( 'Головний визначник е =', e);writeln ( 'a =', x); writeln ( 'b =', y); writeln ( 'c =', z);
writeln( ' Шукана квадратична функція  у=', x,  '*x*x+( ' ,  y,  ' )x+( ',  z,  ' ) ');  end; end.