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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2010, 10:20   #1
Nikolai17
Пользователь
 
Регистрация: 17.10.2009
Сообщений: 20
По умолчанию Метод Рунге Кутты и Эйлера

Здраствуйте господа программисты!

нужно решить диф уравнение f(x,y)=x^2+y^2
на интервале [0,1] методом Рунге Кутты и методом эйлера

и построить график полученной функции
я чето накропал

Код:
 {$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.
сделал методом Рунге Кутты в маткаде
Изображения
Тип файла: png 1 часть.png (6.5 Кб, 67 просмотров)
Тип файла: png 2 часть.png (4.5 Кб, 66 просмотров)
Тип файла: png 3 часть.png (1.7 Кб, 66 просмотров)
Nikolai17 вне форума Ответить с цитированием
Старый 20.05.2010, 11:42   #2
Nikolai17
Пользователь
 
Регистрация: 17.10.2009
Сообщений: 20
По умолчанию

closed please
Nikolai17 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод Рунге-Кутта (Си) PPPPPP Общие вопросы C/C++ 1 13.04.2010 00:55
метод Рунге sneZZZinka Помощь студентам 1 21.12.2009 17:31
Задача Методом Эйлера и методом Рунге-Кутта. Прошу помочь. Очень срочно. BeNeDiKT Паскаль, Turbo Pascal, PascalABC.NET 0 12.05.2009 13:14
Метод Эйлера и Рунге-Кута HECTOR.A. Помощь студентам 0 11.05.2009 16:24