Решение нелинейных уравнений в среде Delphi

Автор работы: Пользователь скрыл имя, 10 Января 2011 в 01:14, курсовая работа

Описание работы

Целью курсовой работы является обретение и закрепление навыков применения информационных технологий и программирования при решении задач по специальности. В курсовой работе создаётся Windows-приложение на алгоритмическом языке Object Pascal в среде визуального программирования Delphi, которое будет обеспечивать решение специализированных задач по решению систем нелинейных уравнений.

Содержание работы

ВВЕДЕНИЕ 7
1 ПОСТАНОВКА ЗАДАЧИ 10
2 РЕШЕНИЕ НЕЛИНЕЙНЫХ УРАВНЕНИЙ В СРЕДЕ DELPHI 11
2.1 Краткое описание сущности метода касательных 11
( метода секущих Ньютона) 11
2.1. Отделение корней и предварительный анализ. 11
2.2. Уточнение корней 14
2.2.1 Уточнение корней методом касательных 14
2.2.2 Уточнение корней методом хорд 17
2.2.3 Уточнение корней методом деления отрезка пополам 19
2.3 Разработка программного продукта в среде Delphi 23
2.4 Результаты тестирования программного продукта 31
4 СРАВНЕНИЕ РЕШЕНИЙ, ПОЛУЧЕННЫХ РАЗЛИЧНЫМИ СПОСОБАМИ 34
ЗАКЛЮЧЕНИЕ 36
СПИСОК ЛИТЕРАТУРЫ 37

Файлы: 1 файл

Курсовая задание 1 вариант 2.doc

— 1.12 Мб (Скачать файл)

function f(xs:Extended):real;

begin

  a := ValA;

  f:= ln(abs(ln(abs(xs*a))))+a*exp(ln(xs)*0.75)+a*sqr(ln(xs))*ln(xs)-sqrt(xs*a)+a;

end;

{Описываем  функцию, реализующую основной  алгоритм}

function DOP(a,b:Extended):real;

label 1;

var x:real;

begin

  repeat

     x:=(a+b)/2;

     if f(a)*f(x)<0 then b:=x

     else

        if f(b)*f(x)<0 then a:=x

        else goto 1;

  until (b-a)<=2*Eps;

  1:

  DOP:=x;

end;

{Раздел  операторов}

begin

a := beg;

b := ends;

x:=DOP(a,b);

MemoDOP.Lines.Add('Уточненное значение корня x='+FloatToStr(x));

end; 

2.3 Разработка программного продукта в среде Delphi 

     Для решения нелинейного уравнение  необходимо предусмотреть ввод исходных данных:

  1. начальное (Interval1Beg) и конечное (Interval1End) значение первого интервала
  2. начальное (Interval2Beg) и конечное (Interval2End) значение второго интервала
  3. начальное (Interval3Beg) и конечное (Interval3End) значение третьего интервал
  4. минимальное значение модуля второй производной на первом интервале – M1
  5. минимально значение модуля второй производной на втором интервале – M2
  6. минимальное значение модуля второй производной на третьем интервале – M3
  7. Точность решения – Eps
  8. Значение переменной а – ValA
 

     Ввод  исходных данных организуем при помощи компонента «TEdit», вывод – при помощи компонента «TMemo». При нажатии кнопки «Решение» (компонент TButton) вызываются подпрограммы решения нелинейного уравнения:

     MetKas – метод касательных;

     MetHord – метод хорд;

     MetDOP – метод деления отрезка пополам.

Внешний вид разработанного приложения представлен  на рисунке 2.6. 
 
 

     Рисунок 2.6 – Внешний вид разработанного приложения 

unit Proga_; 

interface 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls; 

type

  TForm1 = class(TForm)

    MemoKas: TMemo;

    GroupBox1: TGroupBox;

    Label1: TLabel;

    Inter1Beg: TEdit;

    Label2: TLabel;

    Inter2Beg: TEdit;

    Label3: TLabel;

    Inter3Beg: TEdit;

    Label4: TLabel;

    ValueE: TEdit;

    Label5: TLabel;

    Label6: TLabel;

    Label7: TLabel;

    MText1: TEdit;

    MText2: TEdit;

    MText3: TEdit;

    Button1: TButton;

    Label8: TLabel;

    ValueA: TEdit;

    Label9: TLabel;

    Label10: TLabel;

    MemoHord: TMemo;

    Label11: TLabel;

    MemoDOP: TMemo;

    Label13: TLabel;

    Label14: TLabel;

    Label15: TLabel;

    Inter1End: TEdit;

    Inter2End: TEdit;

    Inter3End: TEdit;

    procedure MetDOP(beg,ends : Extended);

    procedure MetKas(beg,ms : Extended);

    procedure MetHord(c,beg,ms : Extended);

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end; 

var

  Form1: TForm1;

  Interval1Beg,Interval2Beg,Interval3Beg : Extended;

  Interval1End,Interval2End,Interval3End : Extended;

  M1,M2,M3 : Extended;

  x,Eps,ValA,ValC : Extended;

implementation 

{$R *.dfm}

procedure TForm1.MetKas(beg,ms : Extended);

{Описание функции  решения уравнения методом касательных}

function getf(xs:Extended):Extended;

var f,a : Extended;

begin

  a := ValA;

  f:= ln(abs(ln(abs(xs*a))))+a*exp(ln(xs)*0.75)+a*sqr(ln(xs))*ln(xs)-sqrt(xs*a)+a;

  getf := f;

end;

{Описание производной  функции}

function getp(xs:real):real;

var a,p : Extended;

begin

  a := ValA;

  p:= 1/(xs*ln(xs*a))+0.75*a/(exp(ln(xs)*0.25))+(3*a*sqr(ln(xs)))/xs-a/(2*sqrt(xs*a));

  getp := p;

end;

{Описание функции,  реализующей алгоритм метода уточнения корней}

function MK(x,M:Extended):Extended;

var x0:Extended;

begin

  repeat

    x0:=x;

    x:=x0-getf(x0)/getp(x0);

  until abs(getf(x))/M<=Eps;

  MK:=x;

end;

{Раздел операторов}

begin

{Находим с помощью  функции МК уточненное значение корня и при-сваиваем его переменной х}

x := 0;

x:=MK(beg,ms);

MemoKas.Lines.Add('Уточненное  значение корня x='+FloatToStr(x));

end; 

procedure TForm1.MetHord(c,beg,ms : Extended);

{Описание функции  решения уравнения методом ХОРД}

function getf(xs:Extended):Extended;

var f,a : Extended;

begin

  a := ValA;

  f:= ln(abs(ln(abs(xs*a))))+a*exp(ln(xs)*0.75)+a*sqr(ln(xs))*ln(xs)-sqrt(xs*a)+a;

  getf := f;

end;

{Описание функции,  реализующей алгоритм метода  уточнения корней}

function MCh(c,x,M:Extended):Extended;

var x0:Extended;

begin

  repeat

    x0:=x;

    x:=(c*getf(x0)-x0*getf(c))/(getf(x0)-getf(c));

  until abs(getf(x))/M<=Eps;

  MCh:=x;

end;

{Раздел операторов}

begin

{Находим с помощью  функции МК уточненное значение  корня и при-сваиваем его переменной  х}

x := 0;

x:=MCh(c,beg,ms);

MemoHord.Lines.Add('Уточненное значение корня x='+FloatToStr(x));

end; 

procedure TForm1.MetDOP(beg,ends : Extended);

var a,b,x:Extended;

{Описываем функцию}

function f(xs:Extended):real;

begin

  a := ValA;

  f:= ln(abs(ln(abs(xs*a))))+a*exp(ln(xs)*0.75)+a*sqr(ln(xs))*ln(xs)-sqrt(xs*a)+a;

end;

{Описываем функцию,  реализующую основной алгоритм}

function DOP(a,b:Extended):real;

label 1;

var x:real;

begin

  repeat

     x:=(a+b)/2;

     if f(a)*f(x)<0 then b:=x

     else

        if f(b)*f(x)<0 then a:=x

        else goto 1;

  until (b-a)<=2*Eps;

  1:

  DOP:=x;

end;

{Раздел операторов}

begin

a := beg;

b := ends;

x:=DOP(a,b);

MemoDOP.Lines.Add('Уточненное значение корня x='+FloatToStr(x));

end; 

procedure TForm1.Button1Click(Sender: TObject);

begin

{очищаем компоненты Мемо}

MemoKas.Clear;

MemoHord.Clear;

MemoDOP.Clear;

{получаем начальные  значения интервалов}

Interval1Beg := StrToFloat(Inter1Beg.Text);

Interval2Beg := StrToFloat(Inter2Beg.Text);

Interval3Beg := StrToFloat(Inter3Beg.Text);

{получаем конечные значения интервалов}

Interval1End := StrToFloat(Inter1End.Text);

Interval2End := StrToFloat(Inter2End.Text);

Interval3End := StrToFloat(Inter3End.Text);

{получаем значения М}

M1 := StrToFloaT(MText1.Text);

M2 := StrToFloaT(MText2.Text);

M3 := StrToFloaT(MText3.Text);

{точность решения}

Eps := StrToFloat(ValueE.Text);

{параметр А}

ValA := StrToFloat(ValueA.Text);

// МЕТОД КАСАТЕЛЬНЫХ

MetKas(Interval1Beg,M1);

MetKas(Interval2End,M2);

MetKas(Interval3Beg,M3);

// МЕТОД ХОРД

MetHord(Interval1End,Interval1Beg,M1);

MetHord(Interval2Beg,Interval2End,M2);

MetHord(Interval3End,Interval3Beg,M3);

// МЕТОД ПОЛОВИННЫЗ ОТРЕЗКОВ

MetDOP(Interval1Beg,Interval1Beg);

MetDOP(Interval2Beg,Interval2Beg);

MetDOP(Interval3Beg,Interval3Beg);

end;

end.  

2.4 Результаты тестирования  программного продукта

       На рисунке 2.7 представлен скриншот программы после ввода исходных данных 

Рисунок 2.7 – Рабочее окно программы

После нажатия  на копку «Решение» вызываются подпрограммы решения нелинейных уравнений, результаты которых помещаются в компоненты «TMemo» (рисунок 2.8)

Рисунок 2.8 – Результат работы разработанного приложения 
3 РЕШЕНИЕ НЕЛИНЕЙНЫХ УРАВНЕНИЙ ПРИ ПОМОЩИ ПАКЕТА MAPLE 

стартуем математический пакет

> restart; 

записываем в символьном виде уравнение 

> y := ln(abs(ln(abs(x*a))))+a*x^(0.75)+a*ln(x)^3-sqrt(a*x)+a;

>

> a := 1;

решаем уравнение на отрезке [0.3;0.45] 

> fsolve(y,x,0.3..0.45); 

решаем уравнение на отрезке [0.5;0.7] 

> fsolve(y,x,0.5..0.7); 

решаем уравнение на отрезке [1.3;1.6] 

> fsolve(y,x,1.3..1.6); 

 

 

4 СРАВНЕНИЕ РЕШЕНИЙ,  ПОЛУЧЕННЫХ РАЗЛИЧНЫМИ  СПОСОБАМИ

     В таблице 4.1 сведены решения, полученные различными методами 

     Таблица 4.1 – Данные, полученные различными методами

     
Метод решения Параметр а Корни уравнения

Касательных 1 0,36 0,65 1,37
Хорд 0,42 0,61 1,39
Деления пополам 0,30 0,50 1,30
Maple 0,40 0,65 1,38

Информация о работе Решение нелинейных уравнений в среде Delphi