- •Содержание
- •Http://vk.Com/pomoshtulgu - создатели этой работы. Отчеты и курсовые на заказ, недорого. Введение
- •Задача расчета неопределенного интеграла
- •1.1 Содержательное описание задачи
- •1.3 Обсуждение задачи
- •Выбор и обоснование численного метода решения задачи
- •Методы нахождения интеграла
- •Математическая формулировка задачи
- •Разработка алгоритма
- •Разработка структур данных
- •Разработка структуры алгоритма
- •Текст программы
- •Описание переменных и структур данных
- •Описание функций
- •Текст программы на языке программирования Borland Pascal 7.0
Текст программы на языке программирования Borland Pascal 7.0
Ниже представлен текст программы, позволяющей решить интеграл методом подведения под знак дифференциала.
unit kurswork;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
Const maxcoordinates=255;
Const maxSize=50;
type
arra=array of string[maxSize];
ShString=string[maxSize];
TMainProgram = class(TForm)
ElementsTOInput: TRadioGroup;// объект для ввода дополнительных элементов в строку
infM: TLabel;//Объект с информацией о вводе М
infY: TLabel;// Объект с информацией о вводе Y
InputM: TEdit; // Объект ввода М
InputY: TEdit; //Объект ввода Y
InfInput: TLabel; // Объект с информацией о вводе строки
InputString: TEdit;
dx: TLabel; // dx
InfOutput: TLabel; //Обхект с информацией о строке вывода
OutputString: TEdit;
plusC: TLabel; // +C
StartInputElement: TButton;// объект, позволяющий вставить в строку дополнительный элемент
Start: TButton;//объект для запуска программы
Inf_Input: TMemo; //объект, содержащий правила ввода данных.
procedure StartInputElementClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainProgram: TMainProgram;
implementation
{$R *.dfm}
procedure check_substr(substr:Shstring;var number:real);
var pr:integer;
begin
if (substr='+')or(substr='-') or(substr='') then
number:=1
else
val(substr,number,pr);
if pr<>0 then
begin
ShowMessage('Обнаружено некорректное значение!');
number:=1;
end;
end;
procedure find_numb(arr:string;start:integer;ended:string;var number:real);
var substr:string[maxSize];
begin
substr:='';
while (arr[start]<>ended) do
begin
substr:=substr+arr[start];
inc(start);
end;
check_substr(substr,number);
end;
procedure find_express(arr:string;start:integer;ended:string;var substr:Shstring);
begin
while (arr[start]<>ended) do
begin
substr:=substr+arr[start];
inc(start);
end;
substr:=substr+arr[start];
end;
procedure tabular_integrals(var arr:ShString;var flag:boolean);
var x1,x0,x,x2,x3,x4,x5,x6,x7:byte;
f,pr,z,j,start,theend:integer;
flag_of_dustributionEinz,flag_of_dustributionZwei:boolean;
substr,substr2,substr3,substr4,substrSymb:ShString;
numb,numbX,firstnumb,subnumb:real;
mark:char;
begin
flag:=false;
end_of_action:=false;
f:=0;
z:=0;
j:=0;
x0:=AnsiPos('x',arr);
mark:=arr[1];
if (x0=0) then
begin
arr:=arr+'x';
flag:=true;
end;
//--------------------------------------------------------
if ((x0<>0)and(AnsiPos('^',arr)=0)and(AnsiPos('/',arr)=0)and(AnsiPos('sin',arr)=0)and(AnsiPos('cos',arr)=0)) then
begin
find_numb(arr,2,'x',numbX);
str((numbX/2):3:3,substr);
arr:=mark+substr+'x^(2)';
flag:=true;
end;
x1:=AnsiPos('x^(',arr); //
if ((x1>0)and(AnsiPos('/',arr)=0)and(flag=false)) then
begin
find_numb(arr,1,'x',numbX);
find_numb(arr,x1+3,')',numb);
str((numbX/(numb+1)):3:3,substr);
str((numb+1):3:3,substr2);
arr:=mark+substr+'x^('+substr2+')';
flag:=true;
end;
//--------------------------------------------------------
x2:=AnsiPos('/(',arr);
if ((x2>0)and(AnsiPos('^',arr)=0)and(arr[x2-1]<>'x')and(flag=false)) then
begin
if ((AnsiPos('x',arr)>0)) then
begin
flag:=true;
j:=1;
z:=AnsiPos('(',arr);
find_express(arr,z,')',substr);
z:=AnsiPos('x',arr);
arr[1]:='1';
if (((arr[z+1])='+')or((arr[z+1])='-')) then
begin
start:=AnsiPos('(',arr)+1;
theend:=AnsiPos('+',arr)+AnsiPos('-',arr);;
end;
if (arr[z+1])=')' then
begin
start:=AnsiPos('+',arr)+AnsiPos('-',arr)+1;
theend:=AnsiPos(')',arr);
end;
find_express(arr,start,arr[theend-2],substr2);
check_substr(substr2,numbX);
str((1/numbX):3:6,substr2);
arr:=mark+substr2+'Ln('+substr+')';
end;
end
else
begin
if ((Pos('x/(',arr)>0)and(flag=false)) then
begin
if ((Pos('x',arr)>0)and(arr[x2+1]<>'^')) then
begin
arr[1]:='0';
flag:=true;
z:=Pos('x^',arr);
f:=Pos(')',arr);
j:=1;
if (((arr[f+1])='+')or((arr[f+1])='-')) then
begin
start:=Pos('(',arr)+1;
theend:=z;
end;
if (arr[f+1]=')')or(arr[f+1]='^') then
begin
start:=Pos('+',arr)+Pos('-',arr)+1;
theend:=z;
end;
find_express(arr,start,arr[theend-1],substr3);
j:=1;
for z:=AnsiPos('(',arr) to length(arr) do
begin
substr4:=substr4+arr[z];
inc(j);
end;
find_numb(arr,2,'x',firstnumb);
find_numb(arr,AnsiPos('^',arr)+2,'x',numb);
check_substr(substr3,numbX);
str(firstnumb/(numbX*numb):5:5,substr);
arr:=mark+substr+'Ln('+substr4+')';
end;
end;
end;
//---------------------------------------------------
x3:=AnsiPos('e^(',arr);
if ((x3>0)and(AnsiPos('x',arr)>0)and(flag=false)) then
begin
if arr[2]<>'e' then
for j:=2 to AnsiPos('e',arr)-1 do
substr2:=substr2+arr[j];
j:=2;
substr[j-1]:='1';
substr[1]:=mark;
find_numb(arr,x3+3,'x',numbX);
check_substr(substr2,firstnumb);
str(firstnumb/(numbX):5:5,substr);
for z:=AnsiPos('e',arr) to Length(arr) do
substr:=substr+arr[z];
arr:=mark+substr;
flag:=true;
end;
//____________------------------------------------------
x4:=Pos('^',arr)-1;
if((Pos('^(',arr)>0)and(flag=false)and(Pos('x',arr)>0)and((ord(arr[x4])>=48)or(ord(arr[x4])<=57))and(AnsiPos('/',arr)=0)and(x1=0)and((AnsiPos('sin',arr)+AnsiPos('cos',arr))=0)) then
begin
find_numb(arr,AnsiPos('(',arr)+1,'x',firstnumb);
find_numb(arr,2,'^',numb);
numb:=((Power(numb,firstnumb)):5:5,substr2;
arr:=mark+arr+'/(Ln('+substr2+')'')';
flag:=true;
end;
//---------------------------------------------------------------------------
if ((AnsiPos('sin',arr)<>0)and(AnsiPos('x',arr)<>0)and(flag=false)and(AnsiPos('cos',arr)=0)) then
if (AnsiPos('^',arr)<>0) then
begin
find_numb(arr,AnsiPos('n',arr)+2,'x',numbX);
find_numb(arr,2,'s',firstnumb);
str((firstnumb/(numbX*4)):5:5,substr);
str((numbX*2):5:5,substr2);
if mark='+' then
arr:='-'+substr+'('+substr2+'x)-sin('+substr2+'x)'
else
arr:='+'+substr+'('+substr2+'x)-sin('+substr2+'x)';
flag:=true;
end
else
begin
find_numb(arr,AnsiPos('n',arr)+2,'x',numbX);
find_numb(arr,2,'s',firstnumb);
str(firstnumb/(numbX):5:5,substr);
str(numbX:5:5,substr2);
if mark='+' then
substr:='-'+substr+'*cos('+substr2+'x)'
else
substr:=substr+'*cos('+substr2+'x)';
arr:=substr;
flag:=true;
end;
//---------------------------------------------------------------------------------------------
x6:=AnsiPos('cos',arr);
if ((x6<>0)and(AnsiPos('x',arr)<>0)and(flag=false)and(AnsiPos('sin',arr)=0)) then
if (AnsiPos('^',arr)<>0) then
begin
find_numb(arr,AnsiPos('s',arr)+2,'x',numbX);
find_numb(arr,2,'c',firstnumb);
str((firstnumb/(numbX*4)):5:5,substr);
str((numbX*2):5:5,substr2);
arr:=mark+substr+'('+substr2+'x)+sin('+substr2+'x)';
flag:=true;
end
else
begin
find_numb(arr,AnsiPos('s',arr)+2,'x',numbX);
find_numb(arr,2,'c',firstnumb);
str(firstnumb/(numbX):5:5,substr);
str(numbX:5:5,substr2);
arr:=mark+substr+'*sin('+substr2+'x)';
flag:=true;
end;
//-----------------------------------------------------------------------------------------------------------------------------------------
if ((AnsiPos('sin',arr)<>0)and(AnsiPos('cos',arr)<>0)and(AnsiPos('x',arr)<>0)and(AnsiPos('^',arr)<>0)and(flag=false)) then
begin
for z:=1 to length(arr) do
if arr[z]='x' then
inc(f);
if f=2 then
begin
x:=AnsiPos('^',arr);
z:=AnsiPos('o',arr)+3;
f:=AnsiPos('n',arr)+2;
while arr[x]<>'(' do
dec(x);
if ((arr[x-1]='n')and(arr[z]=arr[f])) then
begin
find_numb(arr,AnsiPos('n',arr)+2,'x',numbX);
find_numb(arr,AnsiPos('^',arr)+2,')',numb);
if AnsiPos('s',arr)<AnsiPos('c',arr) then
find_numb(arr,2,'s',firstnumb)
else
find_numb(arr,2,'c',firstnumb);
subnumb:=firstnumb;
if AnsiPos('s',arr)<AnsiPos('c',arr) then
find_numb(arr,AnsiPos('*',arr)+1,'c',firstnumb)
else
find_numb(arr,AnsiPos('*',arr)+1,'s',firstnumb);
firstnumb:=firstnumb*subnumb;
numb:=numb+1;
str(firstnumb/(numbX*numb):5:5,substr3);
str(numb:5:5,substr);
str(numbX:5:5,substr2);
arr:=mark+substr3+'sin('+substr2+'x)^('+substr+')';
flag:=true;
end
else
begin
find_numb(arr,AnsiPos('o',arr)+3,'x',numbX);
find_numb(arr,AnsiPos('^',arr)+2,')',numb);
if AnsiPos('s',arr)<AnsiPos('c',arr) then
find_numb(arr,2,'s',firstnumb)
else
find_numb(arr,2,'c',firstnumb);
subnumb:=firstnumb;
flag:=true;
if AnsiPos('s',arr)<AnsiPos('c',arr) then
find_numb(arr,AnsiPos('*',arr)+1,'c',firstnumb)
else
find_numb(arr,AnsiPos('*',arr)+1,'s',firstnumb);
firstnumb:=firstnumb*subnumb;
numb:=numb+1;
str(firstnumb/(numbX*numb):5:5,substr3);
str(numb:5:5,substr);
str(numbX:5:5,substr2);
if mark='+' then
arr:='-'+substr3+'cos('+substr2+'x)^('+substr+')'
else
arr:='+'+substr3+'cos('+substr2+'x)^('+substr+')';
end;
end;
end;
//--------------------------------------------------------------------------------------------
x7:=AnsiPos('/',arr);
z:=AnsiPos('^',arr)+2;
if ((x7<>0)and(AnsiPos('x^',arr)<>0)and(arr[z]='2')and(flag=false)) then
begin
arr[1]:='0';
find_numb(arr,2,'/',subnumb);
z:=AnsiPos('(',arr)+1;
flag_of_dustributionEinz:=false;
flag_of_dustributionZwei:=false;
while (z<=length(arr)) do
begin
if ((z<AnsiPos('+',arr))or(z<AnsiPos('-',arr))) then
begin
if flag_of_dustributionEinz<>true then
if arr[z]='x' then
begin
flag:=true;
flag_of_dustributionEinz:=true;
end
else
substr:=substr+arr[z];
end
else
begin
if flag_of_dustributionZwei<> true then
if ((arr[z]='x')or(arr[z]=')')) then
begin
flag:=false;
flag_of_dustributionZwei:=true;
end
else
substr2:=substr2+arr[z];
end;
inc(z);
end;
z:=0;
if flag=true then
begin
check_substr(substr2,numb);
check_substr(substr3,numbX);
val(substr3,numbX,pr);
val(substr2,numb,pr);
firstnumb:=subnumb;
if firstnumb=0 then
firstnumb:=1;
numbX:=abs(numbX);
numb:=abs(numb);
numbX:=sqrt(numbX);
numb:=sqrt(numb);
str(firstnumb/(numbX*numb):3:3,substr);
str(numbX:3:3,substr3);
str(numb:3:3,substr2);
if (AnsiPos('+',arr)<>0) then
arr:=mark+'('+substr+')arctg('+substr3+'x/'+substr2+')'
else
arr:=mark+'(2*'+substr+')ln|('+substr3+'x+'+substr2+')/('+substr3+'x-'+substr2+')|';
end
else
begin
check_substr(substr2,numbX);
check_substr(substr,numb);
val(substr2,numbX,pr);
val(substr,numb,pr);
firstnumb:=subnumb;
numbX:=abs(numbX);
numb:=abs(numb);
numbX:=sqrt(numbX);
numb:=sqrt(numb);
if firstnumb=0 then
firstnumb:=1;
str(firstnumb/(numbX*numb):5:5,substr3);
str(numbX:5:5,substr2);
str(numb:5:5,substr);
if (AnsiPos('+',arr)<>0) then
arr:=mark+'('+substr3+')arctg('+substr2+'x/'+substr+')'
else
arr:=mark+'(2*'+substr3+')ln|('+substr2+'x+'+substr+')/('+substr2+'x-'+substr+')|';
end;
end;
end;
//------------------------------------------------------------------------------------------
procedure TMainProgram.StartInputElementClick(Sender: TObject);
var pr:integer;
begin
// if ((InputString.MaxLength>0)and(ord(InputString.Ce InputString.Text:=InputString.Text+ 'cos('+InputM.Text+'x)';
try
pr:=strtoint(InputM.Text);
if (ElementsTOInput.ItemIndex=6) or (ElementsTOInput.ItemIndex=7) then
pr:=strtoint(InputY.Text);
except
on EconvertError do
ShowMessage('Ошибка считывания численного значения!!!');
end;
case ElementsTOInput.ItemIndex of
0 : InputString.Text:=InputString.Text+ 'e^('+InputM.Text+'x)';
1 : InputString.Text:=InputString.Text+ 'sqrt('+InputM.Text+'x)';
2 : InputString.Text:=InputString.Text+ 'x^('+InputM.Text+')';
3 : InputString.Text:=InputString.Text+ 'a^('+InputM.Text+'x)';
4 : InputString.Text:=InputString.Text+ 'sin('+InputM.Text+'x)';
5 : InputString.Text:=InputString.Text+ 'cos('+InputM.Text+'x)';
6 : InputString.Text:=InputString.Text+ 'sin('+InputM.Text+'x)^('+InputY.Text+')';
7 : InputString.Text:=InputString.Text+ 'cos('+InputM.Text+'x)^('+InputY.Text+')';
else
ShowMessage('Ошибка ввода.');
end;
end;
procedure checkinputstring(input:string;var flag_of_input:boolean);
var z:integer;
begin
z:=1;
flag_of_input:=true;
while ((z<=length(input))and(flag_of_input=true)) do
if ((ord(input[z])<40)or(ord(input[z])>57)) then
begin
if ((ord(input[z])<>37)and(ord(input[z])<>120)and(ord(input[z])<>94)and(ord(input[z])<>99)and(ord(input[z])<>105)and(ord(input[z])<>115)and(ord(input[z])<>110)and(ord(input[z])<>101)and(ord(input[z])<>111)) then
begin
flag_of_input:=false;
MessageDLG('Ошибка! Вы ввели недопустимый символ в строку ввода.',mtError,mbOKCancel,0);
end
else
inc(z);
end
else
inc(z);
if ((AnsiPos('*',input)>0)and((AnsiPos('sin',input)=0)or(AnsiPos('cos',input)=0))) then
begin
flag_of_input:=false;
MessageDLG('Ошибка! Знак умножения можно употреблять только совместно между sin и cos',mtError,mbOKCancel,0);
end;
z:=AnsiPos('^',input);
if ((z>0)and(input[z+1]<>'(')) then
begin
flag_of_input:=false;
MessageDLG('Ошибка!Степень можно записывать только в скобках',mtError,mbOKCancel,0);
end;
z:=(AnsiPos('sin',input)+AnsiPos('cos',input));
if (not((AnsiPos('sin',input)>0)and(AnsiPos('cos',input)>0))and(z<>0)and(input[z+3]<>'(')) then
begin
flag_of_input:=false;
MessageDLG('Ошибка!Подсинусоидоное или подкосинусоидное выражение можно записывать только в скобках',mtError,mbOKCancel,0);
end;
end;
procedure TMainProgram.StartClick(Sender: TObject);
var i,j,k,sizeofarr:integer;
input:string[255];
arr:arra;
switch:byte;
mark:char;
flag,flag_of_input,switch_of_string:boolean;
begin
switch:=0;
switch_of_string:=true;
sizeofarr:=0;
input:=InputString.Text;
i:=1;
checkinputstring(input,flag_of_input);
if ((input[1]='+') or (input[1]='-')) then
begin
mark:=input[1];
input[1]:='0';
end;
if flag_of_input<>false then
begin
while i<>Length(input) do
begin
if (input[i]='(') then
inc(switch);
if (input[i]=')') then
dec(switch);
if (((input[i]='+') or (input[i]='-'))and(switch=0)) then
begin
inc(sizeofarr);
end;
inc(i);
end;
SetLength(arr,sizeofarr+1);
inc(sizeofarr);
j:=0;
k:=0;
i:=-1;
//--------------------------------------------------------
if ((input[1]<>'0') and (input[1]<>'0')) then
arr[0]:=arr[0]+'+'
else
arr[0]:=mark;
//for i:=0 to sizeofarr do
j:=0;
switch:=0;
OutputString.Text:='';
repeat
inc(i);
While ((((input[j+1]<>'+')and(input[j+1]<>'-'))or(switch>0))and(j<Length(input))) do
begin
inc(j);
if (input[j+1]='(') then
inc(switch);
if (input[j+1]=')') then
dec(switch);
arr[i]:=arr[i]+input[j];
end;
inc(j);
if i<(sizeofarr-1) then
arr[i+1]:=arr[i+1]+input[j];
until((j>=Length(Input))or(switch>0));
for i:=0 to sizeofarr-1 do
begin
tabular_integrals(arr[i],flag);
if flag then
OutputString.Text:=OutputString.Text+arr[i]
else
OutputString.Text:='К сожалению, интеграл решить не удалось...';
end;
end;
end;
procedure TMainProgram.FormCreate(Sender: TObject);
begin
InputString.Text:='';
OutputString.Text:='';
MainProgram.BorderStyle:=bsSingle;
end;
end.
Тестовый ввод
Аналитическое решение и умозрительные результаты
Рассчитаем вручную несколько интегралов: “3x^(2)”, “3sin(2x)^(2)*3cos(2x)”, “3e^(2x)”. Для этого воспользуемся программой Wolfram Alpha (рис. 13).
Рисунок 13. Результаты аналитического решения.
Решение, полученное с использованием разработанного ПО.
Теперь, получив результаты аналитического решения, мы можем сравнить их с результатами, полученными в процессе выполнения программы (рис.13).
Рисунок 13 – Результаты тестового ввода данных в программу.
5.3 Выводы
Результаты аналитического решения и тестового ввода совпадают, можно сделать суждение о том, что в данном конкретном тестовом вводе программа работает корректно.
5. Инструкция пользователю
Данная программа производит вычисление интеграла мтодом подведения под знак дифференциала. Пользователь должен ввести в строку ввода интегральное выражение, затем программа анализирует его и при решении выводит результаты. Все правила ввода указаны в окне программы. Кроме того, пользователь может воспользоваться дополнительным окном ввода, расположенном справа на форме. В случае правильного ввода программа выведет решенный интеграл в строку вывода, откуда ими уже можно пользоваться. В случае же ошибки программой будет выведено сообщение с причиной ошибки.
Заключение
Выполняя данную курсовую работу, я детально изучил понятие интеграла, его применение на практике и в повседневной жизни. Мною было доказано, что применение данного интеграла существенно помогает оптимизировать почти любую задачу. Для решения задачи, поставленной в курсовой работе был использован среда программирования Delphi 7, язык Оbject Pascal, что позволило существенно упростить реализацию программмы, решающей неопределенный интеграл методом подведения под знак дифференциала. В заключении можно сказать, что численные методы присутствуют везде и поэтому знать основные методы и способы их реализации очень полезно.
Список использованной литературы
1. Фаронов В.В. Turbo PASCAL 7.0 – М.: Нолидж, 2001.
2. Турчак Л.И. Основы численных методов. М.: Наука, 1987.
