Форум: "Начинающим";
Текущий архив: 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