program koshi_sist;

{$APPTYPE CONSOLE}

uses
SysUtils;

var t,h,yt,x0,y0,z0,x1,y1,z1:real;
i,n,ind:integer;
y:array[1..100] of real;
type Chisla=array[1..4] of real;

function p(xt:real):real; //Функция p(x)
begin
p:=0 //Ввести свое значение p(x)
end;

function q(xt:real):real; //Функция q(x)
begin
q:=4; //Ввести свое значение q(x)
end;

function f(xt:real):real; //Функция f(x)
begin
f:=sin(xt); //Ввести свое значение f(x)
end;

function f1(xt,yt,zt:real):real;
begin
f1:=zt; //первое ДУ из систему ОДУ 1ого порядка
end;

function f2(xt,yt,zt:real):real;
begin
f2:=f(xt)-q(xt)*yt-p(xt)*zt; //второе ДУ из систему ОДУ 1ого порядка
end;

procedure Koshi(a,b:integer; y0,z0,e:real; Rx:Chisla; var Ry,Rz:Chisla);
var Rxt,xi,yi,zi,k1,k2,l1,l2,yisled,zisled:real;
ind:integer;
begin
//Функция Trunc возвращает целочисленную часть числа с плавающей запятой.
n:=trunc((b-a)/sqrt(e)); //количество разбиений
h:=1/n; //шаг
xi:=a; //Начальное значение х равно a из условия
yi:=y0;
zi:=z0; //Начальные условия

ind:=1;//счетчик точек, значения в которых надо узнать
Rxt:=Rx[ind];//текущая точка, для которой считается значения

while xi<=b do begin
k1:=h*f1(xi,yi,zi);
l1:=h*f2(xi,yi,zi);
k2:=h*f1(xi+h,yi+k1,zi+l1);
l2:=h*f2(xi+h,yi+k1,zi+l1); //коэффициенты

yisled:=yi+(k1+k2)/2;
zisled:=zi+(l1+l2)/2; //следующее значение функций

if (xi+h)>=(Rxt-e) then begin // если дошли до Rxt
Ry[ind]:=yi+(Rxt-xi)/h*(yisled-yi);
// вычисляется значение функций в этой точке с помощью интерполяции
Rz[ind]:=zi+(Rxt-xi)/h*(zisled-zi);
if ind<4 then begin
ind:=ind+1;
Rxt:=Rx[ind]; // берется следующую точку
end;
end;

xi:=xi+h;
yi:=yisled;
zi:=zisled; // присваивается текущие значения.
end;


end;


function ZNACHENIE(xt:real):real;
begin
result:=(1/3)*sin(xt)+cos(2*xt)+(1/3)*sin(2*xt); //Ввести свое решшение
end;


var a,b:integer;
e:real;
Rx,Ry,Rz:Chisla;
begin
a:=0;
b:=1; //Начало и конец интервала

writeln('Vvedite yslovia dlia reshenia zadachi Koshi:');
write('x=');
readln(x0);
write('y(', x0:0:0, ') = ');
readln(y0);
write('y`(', x0:0:0, ') = ');
readln(z0);
write('Vvedite tochnost: e = ');
readln(e);
writeln;

Rx[1]:=0.25; //Точки, в которых требуется посчитать значение
Rx[2]:=0.5;
Rx[3]:=0.75;
Rx[4]:=1;

Koshi(a,b,y0,z0,e,Rx,Ry,Rz);

writeln('Metod Runge-Kutta');
for i:=1 to 4 do
writeln('y[', i, '] = ', Ry[i]:4:4);
{
writeln(' z[', i, '] = ', Rz[i]:4:4); - это если надо вывести значения z
}
writeln;

writeln('Tochnye resheniya DU:');
for i:=1 to 4 do
writeln('y[', i, '] = ', znachenie(Rx[i]):4:4);
writeln;

writeln('Pogreshnost vychisleniy:');
for i := 1 to 4 do
writeln('pogreshnost v toche ',i,' ', abs((Ry[i] - znachenie(Rx[i]))):4:4);
readln;


end.





Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.