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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2011, 17:11   #1
fanLUMEN
 
Аватар для fanLUMEN
 
Регистрация: 06.05.2011
Сообщений: 3
Вопрос Метод трапеций для определения пути обьекта в Delphi 7

Вот написал прогу, а правильно ли не знаю, проверьте пожалуйста)
"Решил", точнее хрень написал, методом трапеций)
В архиве все исходники)
Сильно не пинайте, я только учусь)

Обьект движется по прямой со скоростью v=v(t), где v - непрерывная функцыя времени t. Нужно определить путь S, который пройдёт обьект за время [a,b] от момента t=a до момента t=b(a<b). Получить численное и графическое представление решения задачи.


Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Shape1: TShape;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit5: TEdit;
    Label7: TLabel;
    Label8: TLabel;
    SpeedButton1: TSpeedButton;
    Bevel1: TBevel;
    Label9: TLabel;
    Bevel2: TBevel;
    Label10: TLabel;
    Edit6: TEdit;
    Label11: TLabel;
    Rezultat: TLabel;
    Label12: TLabel;
    kol_iteraciy: TLabel;
    Label13: TLabel;
    Bevel3: TBevel;
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  v0:real;
  t1,t2:real;
  dt,e,i:real;
 
implementation
 
{$R *.dfm}
// задана функція
function F(t:real):real;
begin
   F:=v0*t;
end;
 
procedure Graphic;
var
  re:Trect;
  x1, x2: real; // границя значень аргументу функціїї
  y1, y2: real; // границя значень функції
  x: real; // аргумент функції
  y: real; // значення функції в точці x
  dx: real; // приріст аргументу
  l, b: integer; // лівий нижній кут на графіку
  w, h: integer; // ширина и висота місця для графіка
  mx, my: real; // маштаб по X і Y
  x0, y0: integer; // точка - початок координат
 
begin
 re.Left:=172;
 re.Right:=Form1.ClientWidth;
 re.Top:=57;
 re.Bottom:=Form1.ClientHeight;
 form1.Canvas.FillRect(re);
 // місце виводу графіка
  l := 190; // X - координата лівого верхнього кута
  b := Form1.ClientHeight-30; // Y - координата лівого верхнього кута
  h := (Form1.ClientHeight-57) - 40; // висота
  w := (Form1.Width-172) - 40; // ширина
 
  x1 := 0; // нижня границя діапазону аргумента
  x2 := t2+t2/8; // верхня границя діапазону аргумента
  dx := 0.01; // крок аргумента
 
 // знаходження максимального і мінімального значення
 //  функції на відрізку [x1,x2]
  y1 := f(x1); // максимум
  y2 := f(x1); // мінімум
  x := x1;
  repeat
    y := f(x);
    if y < y1 then y1 := y;
    if y > y2 then y2 := y;
    x := x + dx;
  until (x >= x2);
 
  my := h / abs(y2 - y1); // маштаб по вісі Y
  mx := w / abs(x2 - x1); // маштаб по вісі X
 
 // вісі
  x0 := l;
  y0 := b - Abs(Round(y1 * my));
 
  with form1.Canvas do
  begin
   // вісі
    Pen.Style:=psSolid;
    Pen.Color:=clBlack;
    MoveTo(l, b); LineTo(l, b - h);
    MoveTo(x0, y0); LineTo(x0 + w, y0);
    TextOut(x0 + w,y0 + 5,'X');
    TextOut(x0 - 13,y0 - h - 7,'Y');
    TextOut(l + 5, b - h, FloatToStrF(y2, ffGeneral, 6, 3));
    TextOut(l - 13, b - 12, FloatToStrF(y1, ffGeneral, 6, 3));
   // будування графіка
    x := x1;
 
    repeat
      y := f(x);
      Pixels[x0 + Round(x * mx), y0 - Round(y * my)] := clRed;
      x := x + dx;
    until (x >= x2);
    Pen.Style:=psDot;
    Pen.Color:=clGreen;
    MoveTo(x0 + Round(t1 * mx),y0 + 5);
    LineTo(x0 + Round(t1 * mx),y0 - Round(f(t1) * my));
    TextOut(x0 + Round(t1 * mx)-3,y0 + 7,'t1');
 
    MoveTo(x0 - 5,y0 - Round(f(t1) * my));
    LineTo(x0 + Round(t1 * mx),y0 - Round(f(t1) * my));
    TextOut(x0 + 5,y0 - Round(f(t1) * my) - 15,'F(t1) = '+floattostr(f(t1)));
 
    MoveTo(x0 + Round(t2 * mx),y0 + 5);
    LineTo(x0 + Round(t2 * mx),y0 - Round(f(t2)*my));
    TextOut(x0 + Round(t2 * mx)-3,y0 + 7,'t2');
 
    MoveTo(x0 - 5,y0 - Round(f(t2) * my));
    LineTo(x0 + Round(t2 * mx),y0 - Round(f(t2) * my));
    TextOut(x0 + 5,y0 - Round(f(t2) * my) - 15,'F(t2) = '+floattostr(f(t2)));
 
    TextOut(x0 + Round(((t1+(t2-t1)/2)) * mx),y0 - Round((f(t1+(t2-t1)/2)/2) * my),'S');
  end;
end;
 
 
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  j:longint;
begin
if (form1.Edit1.Text<>'') and (form1.Edit2.Text<>'') and (form1.Edit5.Text<>'') and (form1.Edit6.Text<>'') then
  begin
    t1:=strtofloat(form1.Edit1.Text);
    t2:=strtofloat(form1.Edit2.Text);
    e:=strtofloat(form1.Edit6.Text);
    v0:=strtofloat(form1.Edit5.Text);
  form1.kol_iteraciy.Caption:=inttostr(round(abs(t2-t1)/e));
 
  i:=0;
  for j:=1 to round(abs(t2-t1)/e)-1 do
    i:=i+F(t1+j*e);
  i:=e*(2*i+F(t1)+F(t2))/2;
 
  form1.Rezultat.Caption:=FloatToStrF(i,ffGeneral,9,6); //  виводимо значення інтегралу в на форму
 
  Graphic;  // будуємо графік
  end
else ShowMessage('Не усі поля заповнені!');
end;
 
end.
Метод трапеций.zip

Последний раз редактировалось fanLUMEN; 06.05.2011 в 17:15.
fanLUMEN вне форума Ответить с цитированием
Старый 11.05.2011, 00:14   #2
fanLUMEN
 
Аватар для fanLUMEN
 
Регистрация: 06.05.2011
Сообщений: 3
По умолчанию

Ребят, очень нужно проверить и при возможности исправить, если что не так...
fanLUMEN вне форума Ответить с цитированием
Старый 11.05.2011, 09:11   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

мне всё понравилось.
Единственное, код получился зависимым от системного разделителя (у меня в локали стоит разделитель - десятичная точка, а у Вас в программе запятая.)
Это Вам несложно обработать. Но это мелочи. В остальном, вроде бы, всё хорошо.

p.s. саму математику я не проверял. Что-то считает, похоже, что правильно!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработать метод определения похожести текстов (Паскаль) Анна Я. Помощь студентам 1 19.11.2010 10:23
ВЫЧИСЛЕНИЕ ОПРЕДЕЛЕННЫХ ИНТЕГРАЛОВ (метод трапеций) maliyusha Помощь студентам 13 25.12.2008 00:34
Поиск кратчайшего пути в графе методом полного перебора в глубину. Метод ветвей и границ Олинька Помощь студентам 1 24.12.2008 16:22
Метод Симпсона, прямоугольников и трапеций. Buble07 Помощь студентам 2 15.11.2008 11:03