Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Решение неопред. интегралов. Delph.http://vk.co...docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
1.47 Mб
Скачать
    1. Текст программы на языке программирования 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.

  1. Тестовый ввод

    1. Аналитическое решение и умозрительные результаты

Рассчитаем вручную несколько интегралов: “3x^(2)”, “3sin(2x)^(2)*3cos(2x)”, “3e^(2x)”. Для этого воспользуемся программой Wolfram Alpha (рис. 13).

Рисунок 13. Результаты аналитического решения.

    1. Решение, полученное с использованием разработанного ПО.

Теперь, получив результаты аналитического решения, мы можем сравнить их с результатами, полученными в процессе выполнения программы (рис.13).

Рисунок 13 – Результаты тестового ввода данных в программу.

5.3 Выводы

Результаты аналитического решения и тестового ввода совпадают, можно сделать суждение о том, что в данном конкретном тестовом вводе программа работает корректно.

5. Инструкция пользователю

Данная программа производит вычисление интеграла мтодом подведения под знак дифференциала. Пользователь должен ввести в строку ввода интегральное выражение, затем программа анализирует его и при решении выводит результаты. Все правила ввода указаны в окне программы. Кроме того, пользователь может воспользоваться дополнительным окном ввода, расположенном справа на форме. В случае правильного ввода программа выведет решенный интеграл в строку вывода, откуда ими уже можно пользоваться. В случае же ошибки программой будет выведено сообщение с причиной ошибки.

Заключение

Выполняя данную курсовую работу, я детально изучил понятие интеграла, его применение на практике и в повседневной жизни. Мною было доказано, что применение данного интеграла существенно помогает оптимизировать почти любую задачу. Для решения задачи, поставленной в курсовой работе был использован среда программирования Delphi 7, язык Оbject Pascal, что позволило существенно упростить реализацию программмы, решающей неопределенный интеграл методом подведения под знак дифференциала. В заключении можно сказать, что численные методы присутствуют везде и поэтому знать основные методы и способы их реализации очень полезно.

Список использованной литературы

1. Фаронов В.В. Turbo PASCAL 7.0 – М.: Нолидж, 2001.

2. Турчак Л.И. Основы численных методов. М.: Наука, 1987.