Время ближется к сессии и вот решил я начать делать курсовую работу наконец , но сталкнулся с рядом проблем на которых не могу найти ответа
Вообще вот такое задание :
"Разработать алгоритм и написать программу отделения действительных корней нелинейного уравнения. Используя составленную программу, выделить возможные корни уравнения в интервале длиной = 0.1
Разработать алгоритм и составить программу вычисления действительных корней уравнения методом половинного деления, методом касательных и методом хорд , начертить график. Используя составленную программму , уточнить значение выделенных корней до 0.0001
cos(k*x+sqr(x))+sqr(x)+(1.4/(x+t)) = 1.6
a=0.42
k=2
-10<x<10
Собственно методы я реализовал , но так как уравнение имеет 4 корня ... работают они не совсем корректно , или я чтото не так делаю (скорее всего 2 - ое ) если задавать промежуток в котором находится только 1 корень , то всё считают правильно ... за исключением метода Ньютона (почему-то выводит только крайний левый или крайний правый корень , смотря какой задать промежуток) , поэтому наверное и нужен алгоритм отделения действительных корней ...
Подскажите пожалуйста как сделать это "отделение корней" и почему так работает метод Ньютона (выводит только крайний левый или крайний правый корень , в зависимости от промежутка) , сам я чтото никак не могу дойти до истины
вот текст программы :
Код
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button1: TButton;
Button2: TButton;
Label2: TLabel;
Button3: TButton;
function f1(x:double):double;
function f2(x:double):double;
Function Chord(a, b: Double): Double;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
z,a,b,e,x,c,f11,f22,fx:double;
n:integer;
hasroot:boolean;
const k=2;
t=0.42;
implementation
{$R *.dfm}
function TForm1.f1(x: double): double;
begin
f1:= cos(k*x+sqr(x))+sqr(x)+(1.4/(x+t))- 1.6;
end;
function TForm1.f2(x:double): double;
begin
f2:=2*x-sin(x*x+k*x)*(k+2*x)-(1.4/(sqr(t+x)))
end;
Function TForm1.Chord(a, b: Double): Double;
Begin
Chord := (f1(b)*a - f1(a)*b) / (f1(b) - f1(a));
End;
procedure TForm1.Button1Click(Sender: TObject);
begin
a:=strtofloat(edit1.text);
b:=strtofloat(edit2.text);
e:=strtofloat(edit3.text);
if f1(a)*f2(a)>0 then x:=a
else x:=b;
while abs(f1(x))>e do
begin
x:=x-f1(x)/f2(x);
end;
label2.visible:=false;
label1.caption:=floattostr(x);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
a:=strtofloat(edit1.text);
b:=strtofloat(edit2.text);
e:=strtofloat(edit3.text);
n := 0;
Repeat
C := Chord(a, b);
If f1(a)*f1(C) >= 0 Then a := c
Else b := c;
Inc(n)
Until Abs(Chord(a, b) - C) < e;
z := c;
label2.Visible:=true;
label1.caption:=floattostr(z);
label2.Caption:=floattostr(n);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
a:=strtofloat(edit1.text);
b:=strtofloat(edit2.text);
e:=strtofloat(edit3.text);
begin
f11 := f1(a);
f22 := f1(b);
if f11*f22>0 then
begin
HasRoot := False;
end
else
begin
HasRoot := True;
n:=0;
repeat
x := (a+b)/2;
fx := f1(x);
if f11*fx>0 then
begin
a := x;
f11 := fx;
end
else
begin
b := x;
f22 := fx;
end;
inc(n);
until not (Abs(a-b)>e);
x := (a+b)/2;
end;
end;
label2.Visible:=true;
if hasroot=false then label1.Caption:='Нету корней на выбранном участке'
else label1.caption:=floattostr(x);
label2.Caption:=floattostr(n);
end;
end.