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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2010, 17:38   #1
RobSys
Пользователь
 
Регистрация: 12.10.2010
Сообщений: 19
По умолчанию Построение графика интерполяционного многочлена Лагранжа (Delphi)

Здравствуйте. Требуется ваша помощь в редактировании кода программы.

Я реализую программу, которая строила бы два графика разного цета на одном фоне: график заданной функции и график интерполяционного многочлена Лагранжа, соответствующего данной функции.

Функция: f(x)=(x*x*sqrt(x))/(1+16*x*x)
Среда разработки: Borland Delphi 7

Для построения задаем отрезок [a,b]. А также кол-во узлов интерполяции = N. Затем поделенные отрезки делятся дополнительно на 10 равных частей каждый (в них вычисляются значения функции и многочлена. Данные заносятся в DataFile.txt)
Построение реализуется поточечно. В качестве Canvas выступает Image.

Проблема(!): программа реализует построение графиков, но отображение графиков НЕ ПРАВИЛЬНО (графики зализают ниже оси абсцисс, хотя данная функция может принимать только положительные значения).

В чем требуется помощь: редактирование осей координат так, чтобы на осях отмечались промежуточные точки, поднятие оси абсцисс чуть выше, реализация очищения Image при нажатии кнопки Clear, а также (ГЛАВНОЕ!) правильное отображение графиков.

Исходники прилагаю.

ЗАРАНЕЕ БОЛЬШОЕ СПАСИБО ЗА ПОМОЩЬ.
Вложения
Тип файла: zip 1_Lagrange_Interpolation.zip (215.3 Кб, 60 просмотров)
RobSys вне форума Ответить с цитированием
Старый 12.10.2010, 17:39   #2
RobSys
Пользователь
 
Регистрация: 12.10.2010
Сообщений: 19
По умолчанию

Код:
unit LMainUn;

interface

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

type
  TForm_L = class(TForm)
    Panel_L: TPanel;
    Im_Graphic: TImage;
    Ed_Input_a: TEdit;
    Ed_Input_b: TEdit;
    Ed_Input_N: TEdit;
    Lab_a: TLabel;
    Lab_b: TLabel;
    Lab_N: TLabel;
    But_Build: TButton;
    But_Clear: TButton;
    procedure But_BuildClick(Sender: TObject);
    procedure But_ClearClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form_L: TForm_L;
  h, s, p, x, a, b, h1, znah, c : real;
  N, myheight, mywidth, d       :integer;

function f(x:real):real;

implementation

{$R *.dfm}

function f(x:real):real;
  begin
    f:=(x*x*sqrt(x))/(1+16*x*x)
  end;


procedure TForm_L.But_BuildClick(Sender: TObject);
var
  DataFile  : textfile;
  znah1, zf : real;
  i, j, k   : integer;
begin

  myheight := Im_Graphic.ClientHeight;
  mywidth  := Im_Graphic.ClientWidth;

    a := strtofloat(Ed_Input_a.text);
    b := strtofloat(Ed_Input_b.text);
    N := strtoint  (Ed_Input_N.text);

    if( b >= a ) then
      begin
        AssignFile(DataFile,'datafile.txt');
        rewrite(DataFile);

        h:=(b-a)/(10*N);
        h1:=(b-a)/N;
        znah:=f(a);
        x:=a+h;
        if abs(b)>abs(a) then c:=abs(b) else c:=abs(a);

        d:=trunc(c)+1;
        zf:=znah;
        writeln(DataFile,a,znah,znah);

        with Im_Graphic.Canvas do
          begin
            pen.Color:=clblack;
            moveto(10,myheight-30);
            lineto(mywidth-10,myheight-30);
            textout(mywidth div 2+2,10,'y');
            moveto(mywidth div 2,10);
            lineto(mywidth div 2,myheight-10);
            textout(10,myheight-30,inttostr(d*(-1)));
            textout(mywidth-10,myheight-30,inttostr(d));

            for i:=1 to (10*n) do
              begin
                if ((i mod 10)=0) then
                  begin
                    znah1:=f(x);
                    writeln(DataFile,x,znah1,znah1);
                    pen.Color:=clred;
                    moveto(round((x-h)*(mywidth-20)/(2*d)+mywidth div 2),myheight-round(zf*(myheight-40)+10));
                    lineto(round(x*(mywidth-20)/(2*d)+mywidth div 2),myheight-round(znah1*(myheight-40)+10));
                    pen.Color:=clblue;
                    moveto(round((x-h)*(mywidth-20)/(2*d)+mywidth div 2),myheight-round(znah*(myheight-40)+10));
                    lineto(round(x*(mywidth-20)/(2*d)+mywidth div 2),myheight-round(znah1*(myheight-40)+10));
                    znah:=znah1; zf:=znah1;
                  end
                else
                  begin
                    s:=0;
                    for k:=0 to n do
                      begin
                        p:=f(a+k*h1);
                        for j:=0 to n do
                        if (k<>j) then p:=p*(x-a-h1*j)/((k-j)*h1);
                        s:=s+p
                      end;
                    znah1:=f(x);
                    writeln(DataFile,x,znah1,s);
                    pen.Color:=clred;
                    moveto(round(((x-h)*(mywidth-20))/(2*d)+mywidth div 2),myheight-round(zf*(myheight-40)+10));
                    lineto(round(x*(mywidth-20)/(2*d)+mywidth div 2),myheight-round(znah1*(myheight-40)+10));
                    pen.Color:=clblue;
                    moveto(round((x-h)*(mywidth-20)/(2*d)+mywidth div 2),myheight-round(znah*(myheight-40)+10));
                    lineto(round(x*(mywidth-20)/(2*d)+mywidth div 2),myheight-round(s*(myheight-40)+10));
                    znah:=s; zf:=znah1;
                  end;
                x:=x+h
              end
          end;
        CloseFile(DataFile)
      end
    else
      ShowMessage('b должно быть больше a');
end;

procedure TForm_L.But_ClearClick(Sender: TObject);
begin
 Im_Graphic.Repaint;
end;

end.
RobSys вне форума Ответить с цитированием
Старый 12.10.2010, 17:56   #3
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Хорошо что вы так хорошо оформили пост, но программа не читаема,ибо обилует магическими числами да и вычисление значений при вызове функций- плохой пример для подражания.
Levsha100 вне форума Ответить с цитированием
Старый 12.10.2010, 18:45   #4
RobSys
Пользователь
 
Регистрация: 12.10.2010
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Levsha100 Посмотреть сообщение
Хорошо что вы так хорошо оформили пост, но программа не читаема,ибо обилует магическими числами да и вычисление значений при вызове функций- плохой пример для подражания.
Можно, пожалуйста, конкретнее? Я не позоционирую свою, программу, как пример для подражания в написании кода. Если бы это было так, и моя программа не нуждалась бы в корректировке, то я бы и не составлял данный пост.
Про "магичиские числа": таков метод построения графика. Если его можно упростить (не пребегая к Chart и прочему), то буду рада, если вы подскажите, как.
Я сталкнулся с построением графиков впервые. Так что извините, если код сложно читаем. В этом, собственно, и смысл моего поста: помочь найти и разобраться в ошибках.
RobSys вне форума Ответить с цитированием
Старый 29.10.2010, 21:08   #5
RobSys
Пользователь
 
Регистрация: 12.10.2010
Сообщений: 19
По умолчанию

Тема закрыта.
RobSys вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
разработка программы построения графика интерполяционного полинома KORT Помощь студентам 4 07.11.2011 19:41
Построение графика функций (Delphi) КатюФа Помощь студентам 0 14.05.2010 19:27
Построение графика [Delphi] StudeHt Помощь студентам 7 23.12.2009 21:11
Построение графика в Delphi сер4ей Помощь студентам 0 25.04.2009 15:15
график функции sinx, построит функцию на основе многочлена (по формуле Лагранжа). Alexcomeback Общие вопросы C/C++ 2 18.04.2009 14:08