Главная страница
    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.093 c
15-1349987402
Юрий
2012-10-12 00:30
2013.03.22
С днем рождения ! 12 октября 2012 пятница


15-1341592927
alexdn
2012-07-06 20:42
2013.03.22
Вот такая реклама


2-1333345551
TSubject
2012-04-02 09:45
2013.03.22
Вопрос по выпадающему списку


15-1348568333
Стьюденд
2012-09-25 14:18
2013.03.22
Подсчет одинаковых слов в Delphi


15-1331053532
vrem
2012-03-06 21:05
2013.03.22
телевизор 42" как монитор для компьютера





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский