IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Решение нелинейного уравнения, "Избитые" методы хорд , касательных и половинного деления
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Мужской

Репутация: -  0  +


Всем доброй ночи 1.gif
Время ближется к сессии и вот решил я начать делать курсовую работу наконец , но сталкнулся с рядом проблем на которых не могу найти ответа wacko.gif
Вообще вот такое задание :
"Разработать алгоритм и написать программу отделения действительных корней нелинейного уравнения. Используя составленную программу, выделить возможные корни уравнения в интервале длиной = 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 - ое smile.gif ) если задавать промежуток в котором находится только 1 корень , то всё считают правильно ... за исключением метода Ньютона (почему-то выводит только крайний левый или крайний правый корень blink.gif , смотря какой задать промежуток) , поэтому наверное и нужен алгоритм отделения действительных корней ...

Подскажите пожалуйста как сделать это "отделение корней" и почему так работает метод Ньютона (выводит только крайний левый или крайний правый корень , в зависимости от промежутка) , сам я чтото никак не могу дойти до истины sad.gif
вот текст программы :
Код

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.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Мужской

Репутация: -  0  +


неужто никто не знает как реализовать ? sad.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Мужской

Репутация: -  0  +


Подскажите пожалуйста как реализовать отделение корней , знаю есть 2 способа : графический и аналитический ... с графическим там всё просто , а как быть с аналитическим ? как выделить возможные корни в интервалах длиной 0,1 ?
Весь инет облазил , алгоритма так и не нашёл ... в книжках ссылаются на график , мол начерти и отдели промежуток пересечения с осью "X" ... последняя надежда на вас unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 18.04.2024 19:27
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name