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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2010, 02:20   #1
Беллая
Пользователь
 
Аватар для Беллая
 
Регистрация: 30.07.2010
Сообщений: 44
По умолчанию График функции двух переменных в Delphi

Здравствуйте, форумчане. Мне нужно постоить график функции двух переменных. Пишу свою первую программу на Делфи. (Делфи изучаю по ходу работы.) Посоветуйте простой для новичка способ.
Есть вид функции, 20 пар значений переменных и экстремум. Понятно, что сначала нужно вычислить значения функции во всех точках. Потом.... Потом как быть? Интуиция подсказывает, что надо работать с таблицей. Такого я тоже пока не делала. Все вычисления я сделала в консольной программе. Как теперь быть? Переписывать программу или как-то по другому поступить? Нужен совет.
Say we can do it together
Беллая вне форума Ответить с цитированием
Старый 23.09.2010, 06:57   #2
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

Накидал тебе простой примерчик построения графика функции.
1) Создаешь новый VCL проект в делфи.
2) На форму кидаешь Image со вкладки Additional и ставишь ему в инспекторе объектов свойство Align в alClient - растянется на всю форму он тогда.
3)Далее в секции private пишешь тоже самое, что и в моем коде.
4)Нажимаешь правой кнопкой между строками TForm1 = class(TForm) и end; и в меню выбираешь строку "Complene class at cursor" - делфи автоматически сформирует код для заполнения реализации наших процедуры и функции.
5) Вставляешь мой код реализации в соответствующие строки
6) Создаешь события для Form1 - OnCreate и OnResize и заносишь в них соответствующий код
7) Запускаешь проект и смотришь что получилось

Пример привел как учебный, будут вопросы - спрашивай.
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    //построение сетки координат и графика функции
    procedure PaintGraph;
    //наша функция
    function MySin(x: real): real;

    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.PaintGraph;
const
  Step = 30; //шаг разметки
  Padd = 10; //отступы с краев для сетки координат
  //размер метки шага на оси и размер стрелочек
  Szlab = 8;
var
  x: Real; // аргумент функции
  y: Real; // значение функции в точке x
  x0, y0: Integer; // координаты точки отсчета
  //границы изменения аргумента функции
  x1, x2: Real;
  //границы изменения значения функции
  y1, y2: Real;
  dx: Real; // приращение аргумента
  i: Integer; //счетчик циклов
  //количества шагов разметки по осям
  CountX, CountY: Integer;
begin
  // нижняя граница диапазона аргумента
  x1 := -10;
  // верхняя граница диапазона аргумента
  x2 := 10;
  dx := 0.001; // шаг аргумента

  // найдем максимальное и минимальное значения
  //  функции на отрезке [x1,x2]
  y1 := MySin(x1); // минимум
  y2 := MySin(x1); // максимум
  x := x1;
  repeat
    y := MySin(x);
    if y < y1 then
      y1 := y;
    if y > y2 then
      y2 := y;
    x := x + dx;
  until (x >= x2);

  with Image1 do
  begin
    // определяем как ширину Image 1 делим поплам
    x0 := Width div 2;
    //аналогичну и высоту делим попалам
    y0 := Height div 2;
    //высчитываем количество шагов разметки по оси X
    CountX := (x0 - Padd) div 30;
    //высчитываем количество шагов разметки по оси Y
    CountY := (y0 - Padd) div 30;

    //координаты y считаются сверху вниз. Такое вот правило.
    with Canvas do
    begin
      // рисуем  ось x
      MoveTo(Padd, y0); //padd - отступ с левого края
      LineTo(Width - Padd, y0); //padd - отступ с правого края
      //рисуем стрелочку на конце оси
      //верхняя часть стрелочки
      MoveTo(Width - Padd, y0);
      LineTo(Width - Padd - Szlab, y0 + Szlab);
      //нижняя часть стрелочки
      MoveTo(Width - Padd, y0);
      LineTo(Width - Padd - Szlab, y0 - Szlab);

      //рисуем ось y
      MoveTo(x0, Padd); //padd - отступ сверху
      LineTo(x0, Height - Padd); //padd - отступ снизу
      //рисуем стрелочку на конце оси
      //левая часть стрелочки
      MoveTo(x0, Padd);
      LineTo(x0 - Szlab, Padd + Szlab);
      //правая часть стрелочки
      MoveTo(x0, Padd);
      LineTo(x0 + Szlab, Padd + Szlab);

      //выводим текст '0' рядом с началом координат
      TextOut(x0 - 15, y0 + 10, '0');
      //10 и 15 просто смещения тескста

     //рисуем разметку на оси X
      for i := -CountX to CountX do
      begin
        MoveTo(x0 + Step * i, y0 + Szlab);
        LineTo(x0 + Step * i, y0 - Szlab);
        if i <> 0 then  //чтобы ноль не рисовать
        TextOut(x0 + Step * i, y0 - Szlab * 3, IntToStr(i));
      end;

      //рисуем разметку на оси Y
      for i := -CountY to CountY do
      begin
        MoveTo(x0 + Szlab, y0 - Step * i);
        LineTo(x0 - Szlab, y0 - Step * i);
        if i <> 0 then  //чтобы ноль не рисовать
        TextOut(x0 + Szlab, y0 - Step * i, IntToStr(i));
      end;

      //строим график нашей функции
      x := x1;
      repeat
        y := MySin(x);
        //умножаем на Step - для приведения к нашему масштабу
        Pixels[x0 + Round(x * Step), y0 - Round(y * Step)] := clRed;
        x := x + dx;
      until (x >= x2);  

    end;
  end;

end;

//Стандартные тригонометрические функции (Sin(x), Cos(x), к примеру)
//по умолчанию принимают знаение в радианах.
function TForm1.MySin(x: real): real;
begin
  MySin := 2 * Sin(x) * exp(x / 5);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //развернем форму 
  Form1.WindowState := wsMaximized;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Image1.Picture := nil;//очищаем Canvas
  PaintGraph; //заново рисуем сетку и график 
end;

end.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли

Последний раз редактировалось Roof; 23.09.2010 в 07:04.
Roof вне форума Ответить с цитированием
Старый 23.09.2010, 07:39   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Извините, я спросонья, а TChart чего вчера отменили?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.09.2010, 07:51   #4
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

не, не отменили, но я про него просто забыл, так как на turbo работаю и им не пользуюсь.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 23.09.2010, 11:35   #5
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

Я конечно тоже спросонья (как всегда) но просили функцию 2-х переменных. А это значит будет плоскость. Если я правильно понял - отпишись. Помогу.
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 23.09.2010, 12:41   #6
Беллая
Пользователь
 
Аватар для Беллая
 
Регистрация: 30.07.2010
Сообщений: 44
По умолчанию

Функция от 2-х переменных z(x,y)- это пространство. Мне ведь по шагам всё разок пройтись надо, алгоритм написать для меня. Поошибаться и поработать над ошибками. Выполнить наконец его. Так, глядишь, и научусь. Как лучше писать в личку или на форум? У меня Аськи нет. Я беспокоюсь о том, что мне много спрашивать придется и не всегда по теме топика.
Say we can do it together
Беллая вне форума Ответить с цитированием
Старый 23.09.2010, 12:47   #7
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

Заведи аську. Быстрее дело пойдет. моя - 299-491-377
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 27.09.2010, 23:56   #8
Беллая
Пользователь
 
Аватар для Беллая
 
Регистрация: 30.07.2010
Сообщений: 44
По умолчанию

Здравствуйте, форумчане. Хочу продолжить тему. Задачка моя была такая по данным таблицы определить вид аппроксимирующей эти данные функции, используя метод наименьших квадратов и построить её график для дальнейшей работы с ним (нужно будет сечь его плоскостями параллельными плоскости xOy и проецировать на эту плоскость линию пересечения). Таких поверхностей будет около 8 и в итоге на плоскости xOy должна появиться область компромиссных решений для нескольких критериев оптимизации z1, …. z8, т.е. фактически графическое решение системы неравенств. На рисунке - заштрихованная область. (Все вычисления и графики были сделаны мною в Экселе.)
Что мне за компонент в Делфи использовать? Советуют OpenGL. У меня и компонент скачан и книжка есть. Выскажите своё мнение, кто похожие задачи решал.

Вот что я имею в качестве исходных данных для построения графика:

- вид функции z =r1*x*x+r2*x*y+r3*y*y+r4*x+r5*y+r6* 1;
- экстремум функции
x_ext=11.974,
y_ext=1627.766,
z_ext=5695.909;
- экспериментальные значения входных параметров и функции отклика в 20 опытах
i x[i] y[i] z[i]
1 6 1350 5994,454
2 6 1400 5927,11
3 6 1500 5846,424
4 6 1550 5814,717
5 8 1350 5893,427
6 8 1400 5833,493
7 8 1500 5743,492
8 8 1550 5705,69
9 12 1350 5963,546
10 12 1400 5874,616
11 12 1500 5752,943
12 12 1550 5713,326
13 16 1350 6111,51
14 16 1400 6004,41
15 16 1500 5874,631
16 16 1550 5821,729
17 21 1350 6428,674
18 21 1400 6258
19 21 1500 6092,696
20 21 1550 6022,647
Вложения
Тип файла: rar Область компромиссов из Экселя.rar (12.2 Кб, 24 просмотров)
Say we can do it together
Беллая вне форума Ответить с цитированием
Старый 28.09.2010, 03:33   #9
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

OpenGL - это не компонент. Это открытая графическая библиотека. Компоненты, возможно, решающие часть этих задач - SDL
Можно про них почитать на сайте и скачать компоненты Free версии и с ними поработать и выяснить подходят ли они для решения данной задачи.
Вот сайт разработчиков. http://www.lohninger.com/sdlindex.html
Также есть компоненты на основе библиотеки OpenGl - GLScene.
А Можно просто подключить библиотеку OpenGL к проекту и писать самостоятельно, используя ее функциональность.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли

Последний раз редактировалось Roof; 28.09.2010 в 03:38.
Roof вне форума Ответить с цитированием
Старый 28.09.2010, 07:55   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я бы всетки отрисовывал эти функции в TChart и не морочил голову с OpenGL
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение экстремума функции от двух переменных dekameron Помощь студентам 3 26.05.2010 08:16
на чем в Delphi можно построить простой график от двух перменных в трехмерном пространстве Rekky Общие вопросы Delphi 17 05.05.2010 18:04
График Функции Delphi chezz Помощь студентам 8 11.04.2010 17:43
График функции (delphi 7) Demav Помощь студентам 12 02.07.2009 08:43
Разработка программ с использованием функций. Табулирование функции одного и двух переменных кася Паскаль, Turbo Pascal, PascalABC.NET 5 07.05.2008 20:11