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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2014, 19:54   #1
beygul
Форумчанин
 
Аватар для beygul
 
Регистрация: 15.09.2008
Сообщений: 335
По умолчанию решение нелинейных уравнений (DELPHI)

Здравствуйте уважаемые гуру. Решал задачу. 2 курс. Программирование на делфи. Решал по шаблону, но что то пошло не так, и выходит ужасная ошибка. Помогите пожалуйста исправить мне мои косяки. Заранее вам очень благодарен)
Вот постановка и условие задачи. Я решаю 11 вариант(на 2 фото)



Вот мой исходный код:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    Image2: TImage;
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Button3: TButton;
    Edit3: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    procedure Button2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  x0,y0,k:integer;
  x,y:extended;
  m:integer;
  a,b,e,xn:extended;
implementation

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);        //ãðàôèê
begin
 m := 10;  //ìàñøòàá
 x := -100;
 x0:=200;
 y0:=125;

  while x <=100  do
    begin
      y := 7*sin(x)-1/x+5*exp(x);
      image1.Canvas.Pixels[x0+Round(x*m),y0-Round(y*m)] := clGreen;
      x := x + 0.01;
    end;
end;

   Function f(x:real):real;   //ôóíêöèÿ
 begin
   f:=7*sin(x)-1/x+5*exp(x);
 end;
 Function df(x:real):real;  //ïðîèçâîäíàÿ
 begin
   df:=1/sqr(x)+5*exp(x)+7*cos(x);
 end;
 Function df2(x:real):real;  //2 ïðîèçâîäíàÿ
 begin
   df2:=-(2/(x*x*x))+5*exp(x)-7*sin(x);
 end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  a:=StrToInt(edit1.text);
  b:=StrToInt(edit2.Text);
  e:=StrToFloat(edit3.Text);
   k:=0;
   if f(a)*f(b)<0 then
   begin
      if f(a)*df2(a)>0 then x:=a
      else x:=b;
         while abs(f(x))>e do
         begin
         x:=x-f(x)/df(x);
         k:=k+1;
         end;
   end
   else
   ShowMessage('Íåò êîðíåé');
    if k<30 then
   Label5.caption:='Îòâåò: õ='+floatToStr(x)+' f(x)='+FormatFloat('0.00000',f(x))+'  '+IntToStr(k)
   else
   ShowMessage('Íåò ñõîäèìîñòè');
end;


procedure TForm1.FormActivate(Sender: TObject);
begin
  with Image1.Canvas do
  begin
   Brush.Color := clWhite;
   RoundRect(0, 0, 400, 250, 10,10);
  end;

x0:=200;
y0:=125;

  with Image1.Canvas do
  begin
   MoveTo(x0,245);  //îñè êîîðäèíàò
   LineTo(x0,5);
   MoveTo(5,y0);
   LineTo(395,y0);

   MoveTo(x0,5);   //ñòðåëî÷êè  ó
   LineTo(195,10);
   MoveTo(x0,5);
   LineTo(205,10);

   MoveTo(395,y0);   //ñòðåëî÷êè  õ
   LineTo(390,120);
   MoveTo(395,y0);
   LineTo(390,130);

   TextOut(190,130,'0');
   TextOut(x0+5,5,'y');
   TextOut(385,y0+5,'x');
  end;
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;



end.
Программа компилируется и запускается, НО! Когда я ввожу нужные данные и нажимаю кнопку найти, выходит страшное окно с ошибкой, после чего выделяет строчку
Код:
   f:=7*sin(x)-1/x+5*exp(x);
В коде я её тоже отметил красным цветом.

Очень надеюсь на вашу поддержку. Заранее всем мой МОЛОДЕЖНЫЙ РЕСПЕКТ!
beygul вне форума Ответить с цитированием
Старый 26.05.2014, 20:09   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Текст ошибки в студию.
На вскидку нужно перед этой функой проверять x чтоб функция считалась, если он не равен нулю.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.05.2014, 20:16   #3
beygul
Форумчанин
 
Аватар для beygul
 
Регистрация: 15.09.2008
Сообщений: 335
По умолчанию

вот ошибка. Ввожу в поля эдит следующее:
Цитата:
a=1
b=2
точность=1
Изображения
Тип файла: jpg ошибка.jpg (27.8 Кб, 74 просмотров)
beygul вне форума Ответить с цитированием
Старый 26.05.2014, 20:21   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Смотри где деление на 0. Вот в этом цикле оно точно будет, с учетом того, что начальное значение икса -100
Код:
  while x <=100  do
    begin
      y := 7*sin(x)-1/x+5*exp(x);
      image1.Canvas.Pixels[x0+Round(x*m),y0-Round(y*m)] := clGreen;
      x := x + 0.01;
    end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.05.2014, 20:31   #5
beygul
Форумчанин
 
Аватар для beygul
 
Регистрация: 15.09.2008
Сообщений: 335
По умолчанию

Исправил. Сделал вот так:
Код:
  while x <=100  do
    begin
      if x<>0 then begin
      y := 7*sin(x)-1/x+5*exp(x);
      image1.Canvas.Pixels[x0+Round(x*m),y0-Round(y*m)] := clGreen;
      end;
      x := x + 0.01;
    end;
end;
Однако ошибка всё же вылезла, точно такая же и выделила ту же самую строчку. После чего я решил сделать изменить вот что:
Код:
   Function f(x:real):real;   //ôóíêöèÿ
 begin
 if x<>0 then
   f:=7*sin(x)-1/x+5*exp(x);
 end;
После этого ошибки не обнаружил, однако постоянно выходит сообщение корней нет((((
Что я делаю не так - не могу понять(
beygul вне форума Ответить с цитированием
Старый 26.05.2014, 20:39   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

if x<>0 для extended не корректно. 0.00000000001<>0, но при делении на него переполнение возможно. А такая ситуация при добавлении в цикле 0.01 запросто может возникнуть
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.05.2014 в 20:43.
Аватар вне форума Ответить с цитированием
Старый 26.05.2014, 20:46   #7
beygul
Форумчанин
 
Аватар для beygul
 
Регистрация: 15.09.2008
Сообщений: 335
По умолчанию

И как с этим бороться? Выход есть из данной ситуации?
beygul вне форума Ответить с цитированием
Старый 26.05.2014, 20:49   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну поскольку шаг 0.01, то например можно так проверять
if (x<-0.005) or (x>0.005) then
или
if Abs(x)>0.005 then
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.05.2014, 20:53   #9
beygul
Форумчанин
 
Аватар для beygul
 
Регистрация: 15.09.2008
Сообщений: 335
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ну поскольку шаг 0.01, то например можно так проверять
if (x<-0.005) or (x>0.005) then
или
if Abs(x)>0.005 then
При нажатии на Button3 теперь ошибки конечно не выдаёт, НО постоянно выходит сообщение что корней нет. В чем мой косяк?
beygul вне форума Ответить с цитированием
Старый 26.05.2014, 20:55   #10
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

Все правильно. Вы искали корень в интервале [1;2], а там его нет. Корень 0,147 примерно. Если x в радианах конечно.
Ищите в [0;1], а лучше границы a,b тоже StrToFloat, и искать например [0,01;1]
type_Oleg вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi. Решение системы нелинейных уравнений методами Ньютона и простых итераций. Помогите найти ошибку! Sianessa Помощь студентам 8 13.04.2012 17:32
Решение нелинейных уравнений методом хорд на Delphi 6 или 7 Vovanella Помощь студентам 1 06.12.2010 22:36
Решение нелинейных уравнений s2dentishe Помощь студентам 0 18.04.2010 11:47
решение нелинейных уравнений Жанна__90 Помощь студентам 21 22.07.2009 01:30