Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2009, 22:42   #1
Гудвин
 
Регистрация: 31.03.2009
Сообщений: 6
Вопрос Решение нелинейных уравнений матодом Ньютона

Вот код есть. Необходимо решить уравения 3 методами: хорд, Ньютона, делением пополам. Всё сделал кроме Ньютона.Там надо вычислить начальное приближение, чего вот я не знаю. Помогите кто может доработать. Пожалуйста
Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, TeeProcs, TeEngine, Chart, Series, Math,
  XPMan;
type
  TForm1 = class(TForm)
    Met_Del: TRadioButton;
    Met_Hord: TRadioButton;
    Met_Kasat: TRadioButton;
    Make_Grapf: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Chart1: TChart;
    Series1: TLineSeries;
    Edit3: TEdit;
    Label3: TLabel;
    Result: TButton;
    Edit4: TEdit;
    Label4: TLabel;
    XPManifest1: TXPManifest;
    Memo1: TMemo;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    procedure Make_GrapfClick(Sender: TObject);
    procedure Met_DelClick(Sender: TObject);
    procedure Met_KasatClick(Sender: TObject);
    procedure Met_HordClick(Sender: TObject);
    procedure ResultClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
   x:real;
implementation
Uses Unit2;
{$R *.dfm}
function Kasat(a:real):real;
begin
kasat:=0.6*exp(3*ln(a))-2.3*a-3;
end;
function KasatP(a:real):real;
begin
kasatP:=0.6*exp(3*ln(a))*ln(3)-2.3;
end;
function KasatPP(a:real):real;
begin
kasatPP:=0.6*exp(3*ln(a))*sqr(ln(3));
end;
function hord(b:real):real;
begin
hord:=0.25*sqr(b)*b+b-1.25;
end;
function del(c:real):real;
begin
del:=sqrt(1-c)-cos(sqrt(1-c));
end;
procedure TForm1.Make_GrapfClick(Sender: TObject);
var x,xn,xk,dx:real;
begin
Series1.Clear;
dx:=StrToFloat(Edit3.Text);
if (Edit1.Text<>'') and (Edit2.Text<>'')then
begin
//Метод деление отрезка пополам
if Met_Del.Checked=true then
begin
xn:=StrToFloat(Edit1.Text);
xk:=StrToFloat(Edit2.Text);
x:=xn;
repeat
if (x>=0) then
begin
series1.AddXY(x,del(x),'',clRed);
x:=x+dx;
end
until (x>=xk);
end;
//Метод хорд
if Met_Hord.Checked=true then
begin
xn:=StrToFloat(Edit1.Text);
xk:=StrToFloat(Edit2.Text);
x:=xn;
repeat
series1.AddXY(x,hord(x),'',clRed);
x:=x+dx;
until (x>xk);
end;
//Метод касательных
if Met_Kasat.Checked=true then
begin
xn:=StrToFloat(Edit1.Text);
xk:=StrToFloat(Edit2.Text);
x:=xn;
repeat
series1.AddXY(x,kasat(x),'',clRed);
x:=x+dx;
until (x>xk);
end;
end
else MessageBox(0,'Введите все параметры!','Внимание!',MB_ICONINFORMATION+MB_OK);
end;
procedure TForm1.Met_DelClick(Sender: TObject);
begin
Edit1.Text:='0';
Edit2.Text:='1';
Edit4.Text:='0';
Edit4.Visible:=false;
Label4.Visible:=false;
end;
procedure TForm1.Met_KasatClick(Sender: TObject);
begin
Edit1.Text:='2';
Edit2.Text:='3';
Edit4.Text:='0';
Edit4.Visible:=true;
Label4.Visible:=true;
end;
procedure TForm1.Met_HordClick(Sender: TObject);
begin
Edit1.Text:='0';
Edit2.Text:='2';
Edit4.Text:='0';
Edit4.Visible:=false;
Label4.Visible:=false;
end;
procedure TForm1.ResultClick(Sender: TObject);
var c, x0, x1, eps, a, b, h:real;
begin
if (Edit1.Text<>'') and (Edit2.Text<>'') and (Edit4.Text<>'')then
begin
//Метод деление отрезка пополам
if Met_Del.Checked=true then
begin
eps:=StrToFloat(Edit3.Text);
a:=StrToFloat(Edit1.Text);
b:=StrToFloat(Edit2.Text);
if (b>1) and (a>1) then MessageBox(0,'Недопустимое значение параметра: под корнем отрицательное число!','Внимание!',MB_ICONINFORMATION+MB_OK)
else
begin
repeat
c:=(a+b)/2;
if del(a)*del(c)<0 then b:=c else {a:=c;}
if del(b)*del(c)<0 then a:=c;
until b-a<=eps;
c:=(a+b)/2;
Memo1.Clear;
Memo1.Lines.Add('Ответ:');
Memo1.Lines.Add('X = '+FloatToStrF(c,ffFixed,6,4));
end;
end;
//Метод хорд
if Met_Hord.Checked=true then
begin
eps:=StrToFloat(Edit3.Text);
c:=StrToFloat(Edit2.Text);
x1:=StrToFloat(Edit1.Text);
repeat
x0:=x1;
x1:=(c*hord(x0)-x0*hord(c))/(hord(x0)-hord(c));
until abs(hord(x1)-hord(x0))<=eps;
Memo1.Clear;
Memo1.Lines.Add('Ответ:');
Memo1.Lines.Add('X = '+FloatToStrF(x1,ffFixed,6,4));
end;
//Метод касательных
if Met_Kasat.Checked=true then
begin
eps:=StrToFloat(Edit3.Text);
x0:=StrToFloat(Edit1.Text);
x1:=StrToFloat(Edit4.Text);
repeat
x0:=x1;
h:=kasat(x1)/kasatP(x1);
x1:=x0-h;
until abs(kasat(x0)-kasat(x1))<eps;
Memo1.Clear;
Memo1.Lines.Add('Ответ:');
Memo1.Lines.Add('X = '+FloatToStrF(x1,ffFixed,6,4));
end;
end
else MessageBox(0,'Введите все параметры!','Внимание!',MB_ICONINFORMATION+MB_OK);
end;
end.

Последний раз редактировалось Манжосов Денис :); 08.10.2009 в 23:11.
Гудвин вне форума Ответить с цитированием
Старый 09.10.2009, 12:02   #2
XeN0N
Форумчанин
 
Аватар для XeN0N
 
Регистрация: 18.01.2009
Сообщений: 118
По умолчанию

возможно это поможет. Тут вычисление корней гибридным методом Ньютона-половинного деления.
http://itpaste.ru/762

Начальное приближение - середина отрезка

Последний раз редактировалось XeN0N; 09.10.2009 в 12:07.
XeN0N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
решение нелинейных уравнений Жанна__90 Помощь студентам 21 22.07.2009 01:30
Численное решение нелинейных уравнений (Pascal) Zaz Помощь студентам 7 25.06.2008 14:30
Решение нелинейных уравнений методом хорд, pascal Антонова Анна Помощь студентам 3 09.12.2007 19:24