Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.05.2011, 01:50
Malkovich Malkovich вне форума
Прохожий
 
Регистрация: 08.05.2011
Сообщения: 10
Репутация: 10
Сообщение Метод Рунге-Кутта-Мерсона

Рунге кутта мерсона

Последний раз редактировалось Malkovich, 02.06.2011 в 21:39.
Ответить с цитированием
  #2  
Старый 13.05.2011, 06:26
lmikle lmikle сейчас на форуме
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Теорию и ваш код в студию.
Или в раздел "Работа", но теорию все равно в студию.
Ответить с цитированием
  #3  
Старый 13.05.2011, 16:03
Malkovich Malkovich вне форума
Прохожий
 
Регистрация: 08.05.2011
Сообщения: 10
Репутация: 10
Радость

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    yy0: TEdit;
    tt0: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    nn: TEdit;
    Label3: TLabel;
    bb: TEdit;
    Label4: TLabel;
    ListBox1: TListBox;
    Button1: TButton;
    gr: TImage;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  i,n:integer;
  q1,q2:array [1..10000] of real;
implementation

{$R *.dfm}

 
 
 Procedure RK;
     function f(tt,yy:real):real;

      begin
       f:=3*tt*yy+tt-6*tt;     {Правая часть приведеного диф. уравнеия}
      end;
      var
      k1,k2,k3,k4,y0,t0,y,t,h,b:real;
     begin
       DecimalSeparator:='.';       {Переименовывание разделителя десятичных чисел}
       y0:=StrToFloat(form1.yy0.text);       {считывание данных из тектових блоков}
       t0:=StrToFloat(form1.tt0.text);
       b:=StrToFloat(form1.bb.Text);

       n:=StrToInt(form1.nn.text);

       h:=(b-t0)/n; y:=y0; t:=t0;     {Вычисление шага, присвоения нулевых значений, переменным у,t}
       for i:=1 to n do        {Начало цикла вычислений}
         begin

          q1[i]:=t;       {Занесение значений t,y к массивив}
          q2[i]:=y;
          form1.ListBox1.Items.Add('t = '+FloatToStr(t)+'  y = '+FloatToStr(y)); {Виведение значений t,y}
          k1:=f(t,y);
          k2:=f((t+h/2),(y+(h*k1)/2));
          k3:=f((t+h/2),(y+(h*k2)/2));
          k4:=f((t+h),(y+h*k3));
          y:=y+(h*(k1+2*k2+2*k3+k4))/6;         {Вычисление следующего значения в по итерационной формуле}

          t:=t+h; {Вычисление следующего значения t}
         end;
         form1.ListBox1.Items.Add('t = '+FloatToStr(t)+'  y = '+FloatToStr(y)); {Выведение последнего значения t,y}

     end;
   

Procedure graph;
      var
      x1,x2,x,y,y1,y2,my,mx:real;
      h,w,l,b:integer;
      zh,zw,zn,zz,x0,y0:integer;
      i:integer;
      begin
       DecimalSeparator:='.';        {Переименовывание разделителя десятичных чисел}

                 form1.gr.Canvas.Brush.color:=clWhite;     {Закрашивание области графика}
                 form1.gr.canvas.Brush.style:=bsSolid;
                 form1.gr.Canvas.rectangle(0,0,form1.gr.clientWidth,form1.gr.clientHeight);
                 x1:=q1[1];            {Задання наименьшего и наибольшего значения х из массивив}
                 x2:=q1[n];
                 l:=60;                   {Задание Х,У координат левой нижней точки графику}
                 w:=form1.gr.ClientWidth-80;            {Задание ширины и высоты области графику}
                 b:=form1.gr.ClientHeight-30;
                 h:=form1.gr.clientHeight-60;

              zn:=10;      {Количество квадратов сетки}
                 i:=1;
                 repeat
                 y:=q2[i];                 {Знахождение максимального и минимального значения у}
                 if y<y1 then y1:=y;
                 if y>y2 then y2:=y;
                 i:=i+1; until i>n;


                 my:=h/(y2-y1); mx:=w/(x2-x1); {Вычисление масштаба по у, х}

                
 
 x0:=l;  {Задання координат, откуда станет строиться график}
                 y0:=b;
                 with form1.gr.Canvas do
                     begin      pen.color:=cllime;
                       zh:=h div 10;
                       zw:=w div 10;
                       for zz:=0 to (zn-1) do
                       begin
                       zh:=zh*zz; zw:=zw*zz;
                       moveto(l+zw,b); lineto(l+zw,b-h);                  {Рисование осей}
                       moveto(l,(b - zh)); lineto(w+l,(b - zh));

                       textout(l+zw,y0 + 10, FloatToStrF(x1+(x2-x1)*zz/zn,ffGeneral,4,2));  {Подписование осей}

                       textout(l-50,(y0 - zh), FloatToStrF(y1+(y2-y1)*zz/zn,ffGeneral,4,2));

                       zh:=h div 10;
                       zw:=w div 10;

                       end;
                       textout(l-50,b-h-10,FloatToStrF(y2,ffGeneral,4,2));
                       textout( (l+round(x2*mx)) , y0 + 10,FloatToStrF(x2,ffGeneral,4,2));


                            x:=x1;
                            x0:=l-round(x1*mx);
                           pen.Color:=clred;               {построение графика}
                           for i:=2 to n do
                              begin
                              moveto(x0+round(q1[i-1]*mx),(y0+round(y1*my)-round(q2[i-1]*my)) );
                              lineto(x0+round(q1[i]*mx),(y0+round(y1*my)-round(q2[i]*my)));
                              end;

                     end;
      end;

procedure TForm1.Button1Click(Sender: TObject);
begin
form1.listbox1.Items.Clear;  {Очистка таблицы, вычисления, построение графика}
Rk;  graph;
end;
end.
Aristarh Dark: Читаем правила или буду наказывать нещадно.

Последний раз редактировалось Malkovich, 02.06.2011 в 21:39.
Ответить с цитированием
  #4  
Старый 13.05.2011, 19:35
Аватар для AND_REY
AND_REY AND_REY вне форума
Активный
 
Регистрация: 31.03.2009
Адрес: Украина, г.Днепропетровск
Сообщения: 324
Версия Delphi: Delphi7
Репутация: 3877
По умолчанию

Вышеприведенный код рабочий, результаты выдаёт график строит.
__________________
If end Then begin;
Ответить с цитированием
  #5  
Старый 13.05.2011, 21:01
Malkovich Malkovich вне форума
Прохожий
 
Регистрация: 08.05.2011
Сообщения: 10
Репутация: 10
По умолчанию

Да , все работает

Последний раз редактировалось Malkovich, 02.06.2011 в 21:39.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:06.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025