Главная страница
    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.48 MB
Время: 0.06 c
15-1345527113
ProgRAMmer Dimonych
2012-08-21 09:31
2013.03.22
Можно ли запретить CryptoAPI лезть в сеть?


4-1258539915
ТЧеловек
2009-11-18 13:25
2013.03.22
callback для регулировки громкости


15-1329501039
stas
2012-02-17 21:50
2013.03.22
Аутентификация windows IIS 7


15-1332243086
Kerk
2012-03-20 15:31
2013.03.22
Google Hangouts


15-1337023240
Kerk
2012-05-14 23:20
2013.03.22
Ищется компонент/модуль для шифрования/дешифрования AES-256





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