Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 18.10.2019, 09:38   #1 (permalink)
t13ka
Новичок
 
Регистрация: 02.10.2019
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Метод пристрелки

Условия прикрепил ниже в фотографиях. Попробовал сделать сам, но не получается выполнить условия равенства нуля. Помогите проверить правильность кода
Код:
program asdasd;
uses CRT;

const
NMAX = 100;
dl = 0.001;

Function g2(y1, y2, x: real): real;
begin
g2 := -((2*x*y2 - (x + 2)*y1 + cos(x)) / (x*x + 1)); //(для поиска производной)
end;

Function g1(y1, y2, x: real): real;
begin
g1 := y2; //(для поиска значения)
end;

var
i, n: integer;
dk11, dk21, dk12, dk22, dk13, dk23, dk14, dk24: real;
x, xl, xu, yp, dx, h, x0, x1, x2, d, y1, y2, f0, f1, iter: real;
y: array [0 .. 2, 0 .. NMAX] of real;

begin
n := NMAX;
d := 0.1;
xl := 0;
xu := 1;
yp :=0;
h := (xu - xl) / (n - 1);
x0 := 0;//(значение функции на краю)
dx := 0.01;
x1 := x0 + dx;
iter := 0;

while (abs(d) > dl) do //and not(y[1][0]=100*y[0][0])
begin
iter := iter + 1;
y[1][n] := 0;
y[0][n] :=x0;//хз,что поставить
for i := n downto 1 do begin
x := xu - h*(i - 1);
y1 := y[0][i]; //значение
y2 := y[1][i]; //(первая производная)

dk11 := -h * g1(y1, y2, x);
dk21 := -h * g2(y1, y2, x);

dk12 := -h * g1(y1 + dk11/2, y2 + dk21/2, x - h/2);
dk22 := -h * g2(y1 + dk11/2, y2 +dk21/2, x - h/2);

dk13 := -h * g1(y1+ dk12/2, y2 + dk22/2, x - h/2);
dk23 := -h * g2(y1 + dk12/2, y2 + dk22/2, x - h/2);

dk14 := -h * g1(y1 + dk13, y2 + dk23, x - h);
dk24 := -h * g2(y1 +dk13, y2 + dk23, x - h);

y[0][i - 1] := y[0][i] + (dk11 + 2*(dk12 + dk13) + dk14) / 6;
y[1][i - 1] := y[1][i] + (dk21 + 2*(dk22 + dk23) + dk24) / 6;//первая производная
end;

f0 := y[1][0]/100 - y[0][0];

y[0][n] := x1;
for i := n downto 1 do
begin
x := xu - h*(i - 1);
y1 := y[0][i]; //значение
y2 := y[1][i]; //(первая производная)

dk11 := -h * g1(y1, y2, x);
dk21 := -h * g2(y1, y2, x);

dk12 := -h * g1(y1 + dk11/2, y2 + dk21/2, x - h/2);
dk22 := -h * g2(y1 + dk11/2, y2 +dk21/2, x - h/2);

dk13 := -h * g1(y1+ dk12/2, y2 + dk22/2, x - h/2);
dk23 := -h * g2(y1 + dk12/2, y2 + dk22/2, x - h/2);

dk14 := -h * g1(y1 + dk13, y2 + dk23, x - h);
dk24 := -h * g2(y1 +dk13, y2 + dk23, x - h);

y[0][i - 1] := y[0][i] + (dk11 + 2*(dk12 + dk13) + dk14) / 6;
y[1][i - 1] := y[1][i] + (dk21 + 2*(dk22 + dk23) + dk24) / 6;//первая производная
end;

f1 := y[1][0]/100 - y[0][0];
d := f1 - f0;
x2 := x1 - f1*(x1 - x0) / d;
x0 := x1;
x1 := x2;
writeln(x2);
end;

for i:=0 to n - 1 do
begin
x := h * i;
Writeln('x= ', x: 4: 2, ' y`= ', y[1][i]: 8: 5 ,' y= ', y[0][i]: 8: 5);
end;
writeln('chislo iteracii= ', iter);
end.
Миниатюры
h0c9bmtq9ly.jpg   uunnrtjkwnw.jpg   4dhpdah2vf8-1-.jpg  
t13ka вне форума   Ответить с цитированием

Старый 18.10.2019, 09:38
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Поищите информативные ответы в похожих темах

Метод половинного деления и метод Рунтге-Кутта
Метод шаг за шагом
Метод Ван Хао C++
Метод секущих
Метод шифрования Rot 66

Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 00:54.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.