Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Решение нелинейных уравнений в 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.088 c
2-1339344105
Pcrepair
2012-06-10 20:01
2013.03.22
несколько вариантов кода IdHTTP: что выбрать?


15-1349469003
Юрий
2012-10-06 00:30
2013.03.22
С днем рождения ! 6 октября 2012 суббота


15-1336894204
Юрий
2012-05-13 11:30
2013.03.22
С днем рождения ! 13 мая 2012 воскресенье


15-1352445476
Chorus
2012-11-09 11:17
2013.03.22
Как правильно задать данные о треугольнике?


15-1335007367
Phoenix7
2012-04-21 15:22
2013.03.22
delphi &amp; web