Учебный курс Программирование на Delphi. Модуль 16: различия между версиями

Материал из Wiki Mininuniver
Перейти к навигацииПерейти к поиску
Строка 3: Строка 3:
 
== Пример 1==  
 
== Пример 1==  
 
*'''Условие задачи:'''
 
*'''Условие задачи:'''
 +
 +
Вычислить интеграл
 +
[[Изображение:ф12-1.JPG]]
 +
 +
по методу прямоугольников и трапеций:
 +
 +
[[Изображение:ф12-3.JPG]]
 +
 +
[[Изображение:ф12-2.JPG]]
  
  
  
 
*'''Использованные компоненты:'''
 
*'''Использованные компоненты:'''
 +
 +
Edit1 - для ввода нижнего предела интегрирования;
 +
 +
Edit2 - для ввода вержнего предела интегрирования;
 +
 +
Edit3 - количество интервалов интегрирования;
 +
 +
Label1 - для вывода значения интеграла по методу прямоугольников;
 +
 +
Label2 - для вывода значения интеграла по методу трапеций;
 +
 +
Button - вывод результата.
 +
  
  
 
*'''Программный код:'''
 
*'''Программный код:'''
 +
 +
unit Unit1;
 +
interface
 +
uses
 +
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 +
  Dialogs, StdCtrls;
 +
type
 +
  TForm1 = class(TForm)
 +
    Edit1: TEdit;
 +
    Edit2: TEdit;
 +
    Edit3: TEdit;
 +
    Label1: TLabel;
 +
    Label2: TLabel;
 +
    Button1: TButton;
 +
    Label4: TLabel;
 +
    Label5: TLabel;
 +
    Label6: TLabel;
 +
    Label3: TLabel;
 +
    Label7: TLabel;
 +
    procedure Button1Click(Sender: TObject);
 +
  private
 +
    { Private declarations }
 +
  public
 +
    { Public declarations }
 +
  end;
 +
var
 +
Form1: TForm1;
 +
implementation
 +
{$R *.dfm}
 +
function f(x:real):real;
 +
begin
 +
  f:=2*x*x+4
 +
end;
 +
procedure TForm1.Button1Click(Sender: TObject);
 +
var a,b:real;
 +
    n,i:integer;
 +
    s,h,Ip,It:real;
 +
begin
 +
    a:=StrToFloat(Edit1.Text);
 +
    b:=StrToFloat(Edit2.Text);
 +
    n:=StrToInt(Edit3.Text);
 +
    h:=(b-a)/n;
 +
    s:=0;
 +
    for i:=0 to n-1 do
 +
    s:=s+f(a+i*h);
 +
    Ip:=s*h;
 +
    label1.Caption:=FloatToStr(Ip);
 +
    S:=(f(a)+f(b))/2;
 +
    for i:=1 to n-1 do
 +
    s:=s+f(a+i*h);
 +
    It:=s*h;
 +
    label2.caption:=FloatToStr(It);
 +
end;
 +
end.
  
  
 
*'''Форма с результатом работы программы:'''
 
*'''Форма с результатом работы программы:'''
 
+
[[Изображение:-12-12.JPG]]
  
 
== Пример 2==  
 
== Пример 2==  
  
 
*'''Условие задачи:'''
 
*'''Условие задачи:'''
 +
 +
x<sup>3</sup>-cos(x)=0
 +
 +
найти корни уравнения с помощью метода половинного деления
 
   
 
   
 
*'''Использованные компоненты:'''
 
*'''Использованные компоненты:'''
 +
 +
Label1 - для текстового сообщения
 +
 +
Label2 - для вывода значения корня уравнения, найденного с помощью метода половинного деления
 +
 +
Label3 - для вывода значения корня уравнения, найденного графическим способом
 +
 +
Button - кнопка для запуска процедуры поиска корня методом половинного деления
  
  
  
 
*'''Программный код:'''
 
*'''Программный код:'''
 +
unit Unit1;
 +
interface
 +
uses
 +
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 +
  Dialogs, StdCtrls;
 +
type
 +
  TForm1 = class(TForm)
 +
    Button1: TButton;
 +
    Label2: TLabel;
 +
    Label1: TLabel;
 +
    Label3: TLabel;
 +
    procedure FormPaint(Sender: TObject);
 +
    procedure FormResize(Sender: TObject);
 +
    procedure Button1Click(Sender: TObject);
 +
  private
 +
    { Private declarations }
 +
  public
 +
    { Public declarations }
 +
  end;
 +
var
 +
  Form1: TForm1;
 +
  t:real;
 +
implementation
 +
{$R *.dfm}
 +
function f(x:real):real;
 +
begin
 +
f:=x*x*x-COS(x);
 +
end;
 +
procedure gr;
 +
var
 +
x1,x2:real;
 +
y1,y2:real;
 +
x:real;
 +
y:real;
 +
dx:real;
 +
l,b:integer;
 +
w,h:integer;
 +
mx,my:real;
 +
x0,y0:integer;
 +
begin
 +
l:=10;
 +
b:=Form1.clientheight-20;
 +
h:=Form1.clientheight-40;
 +
w:=Form1.clientwidth-40;
 +
x1:=-3; x2:=3; dx:=0.0001;
 +
y1:=f(x1);
 +
y2:=f(x1);
 +
x:=x1;
 +
repeat
 +
y:=f(x);
 +
if y<y1 then y1:=y;
 +
if y>y2 then y2:=y;
 +
x:=x+dx;
 +
until (x>=x2);
 +
my:=h/(abs(y2-y1));
 +
mx:=w/(abs(x2-x1));
 +
x0:=l;
 +
y0:=b-abs(round(y1*my));
 +
with form1.canvas do begin
 +
moveto(l,b); lineto(l,b-h);
 +
moveto(x0,y0); lineto(x0+w,y0);
 +
textout(l+5,b-h,floattostrf(y2,ffgeneral,6,3));
 +
textout(l+5,b,floattostrf(y1,ffgeneral,6,3));
 +
x:=x1;
 +
repeat
 +
y:=f(x);
 +
if abs(y)<0.01 then t:=x;
 +
pixels[x0+round(x*mx),y0-round(y*my)]:=clred;
 +
x:=x+dx;
 +
until (x>=x2);
 +
end;
 +
end;
 +
procedure TForm1.FormPaint(Sender: TObject);
 +
begin
 +
gr;
 +
Label3.Caption:=floattostr(t);
 +
end;
 +
procedure TForm1.FormResize(Sender: TObject);
 +
begin
 +
form1.Canvas.FillRect(rect(0,0,clientwidth,clientheight));
 +
gr;
 +
end;
 +
procedure TForm1.Button1Click(Sender: TObject);
 +
var
 +
a,b,c:real;
 +
y1,y2,e:real;
 +
begin
 +
a:=-3;
 +
b:=3;
 +
e:=0.00001;
 +
repeat
 +
c:=(a+b)/2;
 +
y1:=f(a);
 +
y2:=f(c);
 +
if (y1*y2>0) then a:=c
 +
else b:=c;
 +
until (abs(b-a))<e;
 +
label2.caption:=floattostr(c);
 +
end;
 +
end.
 +
 +
 +
*'''Форма с результатом работы программы:'''
 +
<center>[[Изображение:форма_график.JPG|650 px]]</center>
 +
 +
== Пример 3==
 +
 +
*'''Условие задачи:'''
 +
 +
Заданы значения температуры:
 +
 +
 +
{| border=1 width=85%
 +
|-
 +
  |<center>'''Y'''</center>|| <center>'''3'''</center>||<center>'''10'''</center>||<center>'''12'''</center>||<center>'''14'''</center>||<center>'''16'''</center>||<center>'''температура'''</center>
 +
|-
 +
|<center>'''X'''</center>||<center>'''1'''</center>||<center>'''4'''</center>||<center>'''5'''</center>||<center>'''12'''</center>||<center>'''17'''</center>||<center>'''дни'''</center>
 +
|}
 +
  
 +
Какая температура была в 7 день?
  
  
*'''Форма с результатом работы программы:'''
+
*'''Использованные компоненты:'''
  
 +
*'''Программный код:'''
  
==Задание==
+
*'''Форма с результатом работу программы:'''
  
 
==Литература==
 
==Литература==

Версия 11:18, 11 апреля 2008

Решение задач с использованием численных методов

Пример 1

  • Условие задачи:

Вычислить интеграл Файл:Ф12-1.JPG

по методу прямоугольников и трапеций:

Файл:Ф12-3.JPG

Файл:Ф12-2.JPG


  • Использованные компоненты:

Edit1 - для ввода нижнего предела интегрирования;

Edit2 - для ввода вержнего предела интегрирования;

Edit3 - количество интервалов интегрирования;

Label1 - для вывода значения интеграла по методу прямоугольников;

Label2 - для вывода значения интеграла по методу трапеций;

Button - вывод результата.


  • Программный код:
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Edit2: TEdit;
   Edit3: TEdit;
   Label1: TLabel;
   Label2: TLabel;
   Button1: TButton;
   Label4: TLabel;
   Label5: TLabel;
   Label6: TLabel;
   Label3: TLabel;
   Label7: TLabel;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function f(x:real):real;
begin
 f:=2*x*x+4
end;
procedure TForm1.Button1Click(Sender: TObject);
var a,b:real;
   n,i:integer;
   s,h,Ip,It:real;
begin
   a:=StrToFloat(Edit1.Text);
   b:=StrToFloat(Edit2.Text);
   n:=StrToInt(Edit3.Text);
   h:=(b-a)/n;
   s:=0;
   for i:=0 to n-1 do
   s:=s+f(a+i*h);
   Ip:=s*h;
   label1.Caption:=FloatToStr(Ip);
   S:=(f(a)+f(b))/2;
   for i:=1 to n-1 do
   s:=s+f(a+i*h);
   It:=s*h;
   label2.caption:=FloatToStr(It);
end;
end.


  • Форма с результатом работы программы:

-12-12.JPG

Пример 2

  • Условие задачи:

x3-cos(x)=0

найти корни уравнения с помощью метода половинного деления

  • Использованные компоненты:

Label1 - для текстового сообщения

Label2 - для вывода значения корня уравнения, найденного с помощью метода половинного деления

Label3 - для вывода значения корня уравнения, найденного графическим способом

Button - кнопка для запуска процедуры поиска корня методом половинного деления


  • Программный код:
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
type
 TForm1 = class(TForm)
   Button1: TButton;
   Label2: TLabel;
   Label1: TLabel;
   Label3: TLabel;
   procedure FormPaint(Sender: TObject);
   procedure FormResize(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var
 Form1: TForm1;
 t:real;
implementation
{$R *.dfm}
function f(x:real):real;
begin
f:=x*x*x-COS(x);
end;
procedure gr;
var
x1,x2:real;
y1,y2:real;
x:real;
y:real;
dx:real;
l,b:integer;
w,h:integer;
mx,my:real;
x0,y0:integer;
begin
l:=10;
b:=Form1.clientheight-20;
h:=Form1.clientheight-40;
w:=Form1.clientwidth-40;
x1:=-3; x2:=3; dx:=0.0001;
y1:=f(x1);
y2:=f(x1);
x:=x1;
repeat
y:=f(x);
if y<y1 then y1:=y;
if y>y2 then y2:=y;
x:=x+dx;
until (x>=x2);
my:=h/(abs(y2-y1));
mx:=w/(abs(x2-x1));
x0:=l;
y0:=b-abs(round(y1*my));
with form1.canvas do begin
moveto(l,b); lineto(l,b-h);
moveto(x0,y0); lineto(x0+w,y0);
textout(l+5,b-h,floattostrf(y2,ffgeneral,6,3));
textout(l+5,b,floattostrf(y1,ffgeneral,6,3));
x:=x1;
repeat
y:=f(x);
if abs(y)<0.01 then t:=x;
pixels[x0+round(x*mx),y0-round(y*my)]:=clred;
x:=x+dx;
until (x>=x2);
end;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
gr;
Label3.Caption:=floattostr(t);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
form1.Canvas.FillRect(rect(0,0,clientwidth,clientheight));
gr;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c:real;
y1,y2,e:real;
begin
a:=-3;
b:=3;
e:=0.00001;
repeat
c:=(a+b)/2;
y1:=f(a);
y2:=f(c);
if (y1*y2>0) then a:=c
else b:=c;
until (abs(b-a))<e;
label2.caption:=floattostr(c);
end;
end.


  • Форма с результатом работы программы:
Форма график.JPG

Пример 3

  • Условие задачи:

Заданы значения температуры:


Y
3
10
12
14
16
температура
X
1
4
5
12
17
дни


Какая температура была в 7 день?


  • Использованные компоненты:
  • Программный код:
  • Форма с результатом работу программы:

Литература

  1. Архангельский. Программирование на Delphi 6. – М: БИНОМ, 2002
  2. Бобровский С. Delphi 7. Учебный курс. – СПб: Питер, 2003
  3. Культин Н. Основы программирования в Delphi 7. СПб: БХВ-Петербург, 2005.

Ссылки

Учебный курс Программирование на Delphi

Учебный план курса Программирование на Delphi