![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
diehard |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 21 Пол: Мужской Репутация: ![]() ![]() ![]() |
Всем доброй ночи
![]() Время ближется к сессии и вот решил я начать делать курсовую работу наконец , но сталкнулся с рядом проблем на которых не могу найти ответа ![]() Вообще вот такое задание : "Разработать алгоритм и написать программу отделения действительных корней нелинейного уравнения. Используя составленную программу, выделить возможные корни уравнения в интервале длиной = 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 - ое ![]() ![]() Подскажите пожалуйста как сделать это "отделение корней" и почему так работает метод Ньютона (выводит только крайний левый или крайний правый корень , в зависимости от промежутка) , сам я чтото никак не могу дойти до истины ![]() вот текст программы : Код 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. |
![]() ![]() |
![]() |
Текстовая версия | 14.07.2025 4:32 |