Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Решение нелинейных уравнений в Delphi   Найти похожие ветки 

 
efgen ©   (2012-05-08 00:47) [0]

Всем привет! Стоит задача: решить нелинейное уравнение методом деления отрезка пополам, методом хорд, методом касательных в Делфи. Мой код находится вот здесь. Программа ругается: "Invalid floating point operation" Подскажите, в чем загвоздка?


 
Юрий Зотов ©   (2012-05-08 04:38) [1]


> Мой код находится вот здесь. Программа ругается

Форум тоже ругается: "Source code not found".


 
efgen ©   (2012-05-08 08:41) [2]

Прошу прощения.

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Label1: TLabel;
   Label2: TLabel;
   Label3: TLabel;
   Label4: TLabel;
   Label5: TLabel;
   Label6: TLabel;
   Label7: TLabel;
   Edit1: TEdit;
   Edit2: TEdit;
   Edit3: TEdit;
   Edit4: TEdit;
   Edit5: TEdit;
   Edit6: TEdit;
   Edit7: TEdit;
   Edit8: TEdit;
   RadioGroup1: TRadioGroup;
   Memo1: TMemo;
   Button1: TButton;
   Button2: TButton;
   Chart1: TChart;
   Button3: TButton;
   Series1: TLineSeries;
   function f(a,x:real):real;
   function p(a,x:real):real;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure Button3Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 a,x:extended;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;

end;

function TForm1.f(a,x:real):real;
begin
f := (10 * sqrt(x) + sqrt(ln(10 - x)) + 10 * power(x, 3) - 10 * power(x, 0.1)) - 10;
end;

function TForm1.p(a,x:real):real;
begin
p:=3*10*power(x,2)+10/(2*sqrt(x))-10/(10*power(x,0.9))+1/(2*x*sqrt(ln(10*x)));
end;

procedure TForm1.Button1Click(Sender: TObject);
var M,c,x,x0,e,a:extended;
   i:integer;
B:array [1..2,1..3]of extended;
begin

B[1,1]:=StrToFloat(Edit1.Text);
B[1,2]:=StrToFloat(Edit2.Text);
B[1,3]:=StrToFloat(Edit3.Text);
B[2,1]:=StrToFloat(Edit4.Text);
B[2,2]:=StrToFloat(Edit5.Text);
B[2,3]:=StrToFloat(Edit6.Text);
a:=StrToFloat(Edit7.Text);
e:=StrToFloat(Edit8.Text);

case RadioGroup1.ItemIndex of
   0: begin
   Memo1.Clear;
      Memo1.Lines.Add(" Метод деления пополам");
      for i:=1 to 3 do begin
           repeat
           x0:=(B[1,i]+B[2,i])/2;
           if f(a,B[1,i])*f(a,x0)<0 then B[2,i]:=x0;
           if f(a,B[1,i])*f(a,x0)>0 then B[1,i]:=x0;
          until (B[2,i]-B[1,i])<=e;
       Memo1.Lines.Add("Корень"+IntToStr(i)+" = "+FloatToStr(x0));
       end;end;
   1: begin

      Memo1.Lines.Add(" Метод хорд");
      for i:=1 to 3 do begin
        c:=B[1,i];
        x:=B[2,i];
        M:=1;
          repeat
           x0:=x;
           x:=(c*f(a,x0)-x0*f(a,c))/(f(a,x0)-f(a,c));
          until (abs (f(a,x))/M)<=e;
       Memo1.Lines.Add("Корень"+IntToStr(i)+" = "+FloatToStr(x));
     end; end;
   2: begin

      Memo1.Lines.Add(" Метод касательных");
      for i:=1 to 3 do begin
        x:=B[1,i];
        M:=1;
          repeat
           x0:=x;
           x:=x0-(f(a,x0))/(p(a,x0));
          until (abs (f(a,x))/M)<=e;
       Memo1.Lines.Add("Корень"+IntToStr(i)+" = "+FloatToStr(x));
     end; end;

 end;

end;

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

procedure TForm1.Button3Click(Sender: TObject);
var x,b,y1,h:extended;
begin
Series1.Clear;
//a:=strtofloat(edit1.Text);
//b:=strtofloat(edit2.Text);
a:=0.1;
b:=1.5;
h:=0.01;
x:=a;
repeat
y1:=a*cos(abs(x))*cos(abs(x))*cos(abs(x))+a*sin(a*x)+a*(sin(x)/cos(x))*(sin(x)/cos(x))*(sin(x)/cos(x))*(sin(x)/cos(x))+a*ln(x)*ln(x)+a+0.5;;
Series1.AddXY(x,y1,"",clTeeColor);
x:=x+h;
until x>b;
end;

end.


 
Давайте будем жрать!   (2012-05-08 10:15) [3]

при вычислении у1 где-то на ноль делишь, небось.


 
efgen ©   (2012-05-08 16:12) [4]

Вставил туда простейшую функцию. Не помогло =,(


 
KilkennyCat ©   (2012-05-08 16:33) [5]

type
TForm1 = class(TForm)
...
  procedure Button3Click(Sender: TObject);
private
  { Private declarations }
  function f(a,x:real):real; // так красивее
  function p(a,x:real):real;
public
  { Public declarations }
end;

Memo1.Clear; // очисти мемо в редакторе и избавься от этого

B[1,1]:=StrToFloat(Edit1.Text);

используй StrToFloatDef, убедись, что точка или запятая тебе нужна (читай про DecimalSeparator)


 
Юрий Зотов ©   (2012-05-09 11:42) [6]

> efgen ©   (08.05.12 08:41) [2]

Код Вы привели, но не указали, на какой строке возникает ошибка. Отладчик должен ее показывать.

Поставьте точку останова на этой строке и когда придете на нее, то проверьте значения переменных. "Invalid floating point operation" - это вычислительная ошибка, она возникает при выполнении запрещенной операции (например, при попытке извлечь квадратный корень из отрицательного числа). Надо определить, какая именно переменная содержит ошибочное значение.


 
Jeer ©   (2012-05-09 19:33) [7]

Пороть за такой код до..


 
Rouse_ ©   (2012-05-09 19:48) [8]


> Пороть за такой код до..

А мне нравиться - нажористый получился :)
ЗЫ: по сабжу - "Invalid floating point operation" выводится в случае NaN.
Вариантов почему море: http://ru.wikipedia.org/wiki/NaN
Проверь куски где например Power делаешь. А вообще для отладки переведи каждую операцию на вывод в переменную и сразу поймаешь где именно падает, там и значения увидишь, на которых происходит падение.


 
Jeer ©   (2012-05-09 20:32) [9]

Начать хотя бы с элементарного..

f := (10 * sqrt(x) + sqrt(ln(10 - x)) + 10 * power(x, 3) - 10 * power(x, 0.1)) - 10;
==
f := 10 * (sqrt(x) + sqrt(ln(10 - x)) + x*x*x - power(x, 0.1)) - 1);


 
Jeer ©   (2012-05-09 20:41) [10]

0.1*sqrt(ln(10 - x)) - для начала :)


 
KilkennyCat ©   (2012-05-10 15:59) [11]


> для начала :)


> p:=3*10*....



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.064 c
15-1339225868
Регулятор
2012-06-09 11:11
2013.03.22
Ускорить поиск строки в массиве строк.


15-1333975733
MBo
2012-04-09 16:48
2013.03.22
Delphi XE. Окно Watch List.


15-1338467677
Андреевич
2012-05-31 16:34
2013.03.22
исходник "юнита" в шарпе


2-1330577950
теркин
2012-03-01 08:59
2013.03.22
Фильтрация дочернего набора данных


2-1344342520
Andrey K
2012-08-07 16:28
2013.03.22
Возведение в квадрат





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский