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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2008, 22:24   #1
xMass
Пользователь
 
Регистрация: 20.05.2008
Сообщений: 23
По умолчанию Решение нелинейного уравнения и построение графика

Всем привет
(язык Delphi)
У меня есть 3 вопроса,которые меня немного ставят в тупик.
Прежде расскажу задание начала задание:
"Разработать схему алгоритма и составить программу вычисления таблицы значений функции
Y=a*x^4+b*Ln(x^2+b^2)
известно XN (начальное значение икса), XK (конечное значение икса), DX (шаг, с которым топаем от начального до конечного значения)
a=7.72
b - решение уравнения tg(X)=X
"

Ещё, прежде чем спросить выложу текст программы, что у меня получился

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, ExtCtrls, TeeProcs, TeEngine, Chart;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit4: TEdit;
    Label4: TLabel;
    Button1: TButton;
    Button2: TButton;
    StringGrid1: TStringGrid;
    Label5: TLabel;
    Chart1: TChart;
    Button3: TButton;
    Series1: TLineSeries;
    TeeFunction1: TAddTeeFunction;
    Series2: TLineSeries;
    Series3: TLineSeries;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    {procedure FormCreate(Sender: TObject);}
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Type W=array [1..10] of extended;

const a=7.72;
var
  Form1: TForm1;
  X, Y:W;
  K, N: integer;
  XN, XK, DX: extended;
  SK, SX, SY: string;
  b:real;
implementation

{$R *.dfm}

function F_func(z:real):real;
         begin F_Func:=sin(z)/cos(z)-z;
         end;

procedure iwem_b(var b:real{; str:byte});
          const km=150;
                eps=0.001;
          var i:byte;
              fm,fb,m,d:real;
          begin m:=0;
                d:=20;
                for i:=1 to km do
                    begin fm:=F_func(m);
                          b:=(m+d)/2;
                          fb:=F_func(b);
                          if abs(fb)<=eps then exit;
                          if (fm/100)*(fb/100)>0 then m:=b
                                                 else d:=b;
                    end;
                {str:=1}
                form1.label5.Caption:=floatToStr(b);
          end;

procedure TForm1.Button1Click(Sender: TObject);
var k:integer;
begin
XN:=StrToFloat(edit1.text);
XK:=StrToFloat(edit2.text);
DX:=StrToFloat(edit3.text);
{edit4.text:=FloatToStr(b);  }
{Eps:=StrToFloat(edit4.text);}

X[1]:=XN;
Y[1]:=X[1]*X[1]*X[1]*X[1]*a+Ln(X[1]*X[1]+b*b);

N:=trunc((XK-XN)/DX);


For K:=2 to N do
       begin
       X[K]:=X[K-1]+DX;
       Y[K]:=X[K]*X[K]*X[K]*X[K]*a+Ln(X[K]*X[K]+b*b);
       end;

       StringGrid1.Cells[0,0]:='N';
       StringGrid1.Cells[1,0]:='X';
       StringGrid1.Cells[2,0]:='Y';

For k:=1 to N do
       begin
            Str(K, SK);
            form1.StringGrid1.Cells[0,K]:=SK;

            Str(X[K]:10:4,SX);
            form1.StringGrid1.Cells[1,K]:=SX;

            Str(Y[K]:10:4,SY);
            form1.StringGrid1.Cells[2,K]:=SY;

          end;
   end;

procedure TForm1.Button2Click(Sender: TObject);
var k:integer;
begin
edit1.Clear;
edit2.Clear;
edit3.Clear;
edit4.Clear;
chart1.series[0].Clear;
   for K:=1 to N do
     form1.StringGrid1.Cells[0,K]:='';
     form1.StringGrid1.Cells[1,K]:='';
     form1.StringGrid1.Cells[2,K]:='';

end;

end.
Button1 - кнопа вычислить
Button2 - кнопа очистить

Непосредственно вопросы:
1) В label5 значение уравнения tgX=X у меня не выводит, в чем причина? Вообще каким путем можно определить считает ли у меня порграмма константу b?

2) Есть таблица со столбцами 1 - N, сколько получилось иксов, 2 - X, какие иксыб 3 - Y, какие получились игрик. При нажатии кнопки очистить у меня очищается только столбец с N, а с Y, X нет, почему?

3) Как построить график этого уравнения Y=a*x^4+b*Ln(x^2+b^2)
с помощью Chart?

И ещё, есть какая-нибудь удобная программа для написания блок схем ?
Заранее огромное спасибо!

Последний раз редактировалось xMass; 20.05.2008 в 23:02.
xMass вне форума Ответить с цитированием
Старый 21.05.2008, 08:24   #2
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

1. Этой строкой вы завершаете процедуру: if abs(fb)<=eps then exit;
поэтому строка form1.label5.Caption:=floatToStr(b) ; не будет выполнена никогда.
Завершать нужно не процедуру, а цикл if abs(fb)<=eps then break;
2. В данном цикле выполняется только первая строка, остальные строки вне цикла
Код:
   for K:=1 to N do   
     form1.StringGrid1.Cells[0,K]:='';   
     form1.StringGrid1.Cells[1,K]:='';   
     form1.StringGrid1.Cells[2,K]:='';
замените на
Код:
   for K:=1 to N do
   begin   
     form1.StringGrid1.Cells[0,K]:='';   
     form1.StringGrid1.Cells[1,K]:='';   
     form1.StringGrid1.Cells[2,K]:='';
   end;
3. Качайте с сайта клуба книгу Архангельского "100 компонентов Delphi", там все подробно с примерами.
_Dmitry вне форума Ответить с цитированием
Старый 21.05.2008, 20:22   #3
xMass
Пользователь
 
Регистрация: 20.05.2008
Сообщений: 23
По умолчанию

_Dmitry
спасибо за ответ
2 - помогло, 3 - и вправду очень хорошая книга, спасибо
ПО поводу 1 - замена на

Код:
procedure iwem_b(var b:real{; str:byte});
          const km=150;
                eps=0.001;
          var i:byte;
              fm,fb,m,d:real;
          begin m:=0;
                d:=20;
                for i:=1 to km do
                    begin fm:=F_func(m);
                          b:=(m+d)/2;
                          fb:=F_func(b);
                          if abs(fb)<=eps then break;
                          if (fm/100)*(fb/100)>0 then m:=b
                                                 else d:=b;
                    form1.label5.Caption:=floatToStr(b);
                    end;
                {str:=1}

          end;
ни к чему не привела
значение констаны b по-прежнему не выводится в 5-й лэйбл
xMass вне форума Ответить с цитированием
Старый 21.05.2008, 20:55   #4
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Цитата:
значение констаны b по-прежнему не выводится в 5-й лэйбл
А где вы вызываете процедуру iwem_b, которая и пишет это значение? Я не нашел в вашей программе.
_Dmitry вне форума Ответить с цитированием
Старый 21.05.2008, 21:39   #5
xMass
Пользователь
 
Регистрация: 20.05.2008
Сообщений: 23
По умолчанию

Цитата:
Сообщение от _Dmitry Посмотреть сообщение
А где вы вызываете процедуру iwem_b, которая и пишет это значение? Я не нашел в вашей программе.

Все, я нашел ошибку, спасибо огромное за помощь)
xMass вне форума Ответить с цитированием
Старый 29.10.2012, 19:42   #6
DangerousV
Новичок
Джуниор
 
Регистрация: 29.10.2012
Сообщений: 1
По умолчанию xMass

а что делает вот эта функция?
N:=trunc((XK-XN)/DX);
DangerousV вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение уравнения Datrav Паскаль, Turbo Pascal, PascalABC.NET 2 06.06.2008 08:23
Решение нелинейного уравнения методом Ньютона Tina Общие вопросы C/C++ 2 04.06.2008 21:48
текст программы для решения нелинейного уравнения методом простых итераций Dyst Помощь студентам 2 14.05.2008 22:00
Решение уравнения вида ax+by=1 :)) Solny6ko YasnoE Помощь студентам 4 14.06.2007 14:38
Решение нелинейного уровнения Delphi Luska Помощь студентам 2 28.05.2007 17:40