Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2011, 00:18   #1
Pigoreva
 
Регистрация: 05.05.2011
Сообщений: 7
По умолчанию Системы ДУ

Доброе время суток! Нужно написать программу для решения систем ДУ, используя все прелести ООП. Есть исходник для одного ДУ, решается 3-мя методами: Методом Эйлера, модифицированным методом Эйлера и Рунге-Кутта (по моему, 4-го порядка). Вот текст программы:

program Project1;

{$APPTYPE CONSOLE}
{$N+}

const
eps = 1E-5;
x0 = 0;
y0 = 0;

type
TFunc = function(x, y: extended): extended;

function func(x, y: extended): extended; far;
begin
func := sqr(x) + sqr(y);
end;

function Euler(f: TFunc; x0_, x_end, y0_: extended; n: word): extended;
{ где x0_ и y0_ - начальное условие
x_end - точка, в которой необходимо вычислить результат
n - количество шагов для вычисления результата }
var
i: word; { счетчик цикла }
x, h: extended; { текущая точка и длина шага }
res: extended; { переменная для накопления конечного результата функции }
begin
h := (x_end - x0_) / n; { Находим длину шага }
res := y0_; { устанавливаем начальные значения }
x := x0_;
for i := 1 to n do
begin { вычисляем результат по методу Эйлера }
res := res + h * f(x, res);
x := x + h; { переходим к следующей точке }
end;
Euler := res; { присваиваем конечный результат функции }
end;

function Euler2(f: TFunc; x0_, x_end, y0_: extended; n: word): extended;
{ где x0_ и y0_ - начальное условие
x_end - точка, в которой необходимо вычислить результат
n - количество шагов для вычисления результата }
var
i: word; { счетчик цикла }
x, h: extended; { текущая точка и длина шага }
res: extended; { переменная для накопления конечного результата функции }
begin
h := (x_end - x0_) / n; { Находим длину шага }
res := y0_; { устанавливаем начальные значения }
x := x0_;
for i := 1 to n do
begin { вычисляем результат по исправленному методу Эйлера }
res := res + h * (f(x, res) + f(x + h, res + h * f(x, res))) / 2;
x := x + h; { переходим к следующей точке }
end;
Euler2 := res; { присваиваем конечный результат функции }
end;

function RungeKutt(f: TFunc; x0_, x_end, y0_: extended; n: word): extended;
{ где x0_ и y0_ - начальное условие
x_end - точка, в которой необходимо вычислить результат
n - количество шагов для вычисления результата }
var
i: word; { счетчик цикла }
x, h: extended; { текущая точка и длина шага }
res: extended; { переменная для накопления конечного результата функции }
k1, k2, k3, k4: extended; { вспомогательные переменные вычисления результата }
begin
h := (x_end - x0_) / n; { Находим длину шага }
res := y0_; { устанавливаем начальные значения }
x := x0_;
for i := 1 to n do
begin { вычисляем результат по методу Рунге-Кутта 4го порядка }
k1 := f(x, res);
k2 := f(x + h / 2, res + h * k1 / 2);
k3 := f(x + h / 2, res + h * k2 / 2);
k4 := f(x + h, res + h * k3);
res := res + h * (k1 + 2 * k2 + 2 * k3 + k4) / 6;
x := x + h; { переходим к следующей точке }
end;
RungeKutt := res; { присваиваем конечный результат функции }
end;

begin
writeln('4islennoe resenie div uravnenia:');
writeln(#10, ' k'' =y^2+x^2 k(0)=0; x_end=', 1);
writeln(#10, 'method Eilera:');
writeln('n=5 000, result: ', Euler(func, x0, 1, y0, 5000):5:5);
writeln('n=10 000, result: ', Euler(func, x0, 1, y0, 10000):5:5);
writeln('n=25 000, result: ', Euler(func, x0, 1, y0, 25000):5:5);
writeln(#10, 'method Eilera2:');
writeln('n=50, result: ', Euler2(func, x0, 1, y0, 50):5:5);
writeln('n=100, result: ', Euler2(func, x0, 1, y0, 100):5:5);
writeln('n=250, result: ', Euler2(func, x0, 1, y0, 250):5:5);

writeln(#10, 'method Ronge kytta:');
writeln('n=50, result: ', RungeKutt(func, x0, 1, y0, 50):5:5);
writeln('n=100, result: ', RungeKutt(func, x0, 1, y0, 100):5:5);
writeln('n=200, result: ', RungeKutt(func, x0, 1, y0, 200):5:5);

write(#10, 'Press Enter to continue.');
readln;

end.
Pigoreva вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Операционные системы!!!!!!!! lera93 Помощь студентам 12 20.12.2010 11:41
Нелинейные системы Diplomnik Помощь студентам 2 13.12.2010 18:05
Системы счисления.10->5-7. Corpinccom Помощь студентам 0 22.09.2010 12:54
Операционные системы slipokorn Помощь студентам 0 26.05.2010 05:05
Системы Artem_sky Операционные системы общие вопросы 1 12.11.2009 19:17