Задача расчета неопределенного интеграла
Содержание
Введение
|
1.Задача расчета неопределенного интеграла
1.1 Содержательное описание задачи
1.2 Математическая формулировка задачи
1.3 Обсуждение задачи
2. Выбор и обоснование численного метода решения задачи
2.1 Методы нахождения интеграла
2.2 Математическая формулировка задачи
3. Разработка алгоритма
3.1 Разработка структур данных
3.2 Разработка структуры алгоритма
3.3 Схема алгоритма
4. Текст программы
4.1 Описание переменных и структур данных
4.2 Описание функций
4.3 Текст программы на языке программирования Object Pascal
5. Тестовый ввод
5.1 Аналитическое решение и умозрительные результаты
5.2 Решение, полученное с использованием разработанного ПО
5.3 Выводы
6. Инструкция пользователю
Заключение
Список использованных источников
http://vk.com/pomoshtulgu — создатели этой работы. Отчеты и курсовые на заказ, недорого.
Введение
Информатика — это обширнейшая область человеческой деятельности, связанная с процессами преобразования информации с помощью компьютеров и их взаимодействием со средой применения. Термин информатика возник в 60-х гг. во Франции для названия области, занимающейся авторизированной обработкой информации с помощью электронных вычислительных машин. Главная функция информатики заключается в разработке методов и средств преобразования информации и их использовании в организации технологического процесса переработки информации. Информатика появилась благодаря развитию компьютерной техники, базируется на ней и совершенно немыслима без неё.
Не менее важно в нашем мире знание математики. Это позволяет конструировать быстродействующие алгоритмы, которые активно используются в программном обеспечении. Одним из основополагающих элементов математики и геометрии является интеграл. Его первичная формулировка гласит: вычисление площади некоторой ограниченной и неограниченной поверхности. Эта возможность позволяет ему быть актуальным в геометрии, географии. Также с помощью интеграла можно считать плотность, некоторые физические силы и экономические коэффициенты.
Самым основным методом интегрирования является подстановка под знак дифференциала. Языком программирования был выбран язык Object Pascal. Object Pascal — результат развития языка Турбо Паскаль, который, в свою очередь, развился из языка Паскаль. Паскаль был полностью процедурным языком, Турбо Паскаль, начиная с версии 5.5, добавил в Паскаль объектно-ориентированные свойства, а в Object Pascal — динамическую идентификацию типа данных с возможностью доступа к метаданным классов (то есть к описанию классов и их членов) в компилируемом коде, также называемом интроспекцией — данная технология получила обозначение RTTI.
В описании выполнения поставленной задачи имеется ряд пунктов, которые описывают процесс разработки алгоритма и программы для решения неопределенного интеграла. В содержании данной работы расмотрены следующие разделы и подразделы:
1.Задача расчета неопределенного интеграла – раздел описывает постановку задачи решения неопределенного интеграла методом подведения под знак дифференциала;
1.1. Содержательное описание задачи – в этом подразделе проводится полное и емкостное описание задачи, примеры использования ее на практике
1.2.Математическая формулировка задачи – в этом подразделе вводятся математические описания метода подведения под знак дифференциала;
1.3 Обсуждение задачи – в этом подразделе происходит краткий анализ вышестоящего подпункта.
2.1.Методы нахождения интенграла – в подразделе производится описание существующих численных методов, способных выполнить задачу данной работы
2.2.Математическая формулировка задачи – подраздел содержит полное описание метода подведения под знак дифференциала, возможность реализации в программе
3.1.Разработка структур данных – в подразделе описывается разработка структур данных, используемых в программе;
3.2. Разработка структур алгоритма – в этом подпункте описывается разработка структуры алгоритма
3.3.Схема алгоритма – в подразделе представлены схемы алгоритма решения интеграла методом подстановки под знак дифференциала
4.1.Описание переменных и структур данных – в подразделе проводится описание переменных и данных, используемых в тексте программы;
4.2.Описание функций – в подразделе проводится описание функций, используемых для реализации программы;
4.3 Текст программы на языке программирования object pascal – в этом подпункте представлен текст программы, производящий вычисление неопределенного интеграла методом подведения под знак дифференциала
5. Тестовая задача – в разделе описывается конкретная содержательная задача, список исходных данных, описывается порядок решения задачи, описываются полученные результаты, и проводится их анализ;
5.1. Аналитическое решение и умозрительные результаты – в подразделе производится аналитическое решение нескольких интегралов
5.2. Решение задачи с использованием разработанного ПО – в подразделе представлено решение тех же интегралов но с использованием программы
5.3.Выводы – в подразделе подведены итоги полученных результатов, их совместимость.
6.Инструкция пользователю – пункт содержит инструкцию пользователю.
1. Задача расчета неопределенного интеграла
1.1 Содержательное описание задачи
В данной курсовой работе требуется создать программу, позволяющую вычислять неопределенный интеграл. Область их применения – крайне велика.
Самое первое и простое, что обнаруживается при анализе этого вопроса – это площадь каких-либо фигур. Интеграл является самым удобным средством для этого. Но, зная площадь можно определить и объем! Достаточно понятный пример – это измерение объема топлива в канистре определенной формы при помощи метрштока. Это лишь самые простые примеры использования интегралов. Многие вычисления в физике работают через интегральные вычисления:
— Моменты и центры масс плоских кривых. Если дуга кривой задана уравнением y=f(x), a≤x≤b, и имеет плотность 1)=(x), то статические моменты этой дуги Mx и My относительно координатных осей Ox и Oy равны
-Моменты инерции IХ и Iу относительно тех же осей Ох и Оу вычисляются по формулам
-Координаты центра масс и — по формулам
-Путь, пройденный точкой при неравномерном движении по прямой с переменной скоростью за промежуток времени от до вычисляется по формуле .
-Работа, произведенная переменной силой f(х) при перемещении по осиОх материальной точки от х = а до х=b, находится по формуле При решении задач на вычисление работы силы часто используется закон Гука: F=kx, (3) где F — сила Н; х—абсолютное удлинение пружины, м, вызванное силой F, а k —коэффициент пропорциональности, Н/м.
-Длина дуги. Пусть плоская кривая АВ задана уравнением у =f(x) (a x b),причем f(x) и f?(x) — непрерывные функции в промежутке [а, b]. Тогда дифференциал dl длины дуги АВ выражается формулой или , а длина дуги АВвычисляется по формуле (4)
где а и b—значения независимой переменной х в точках А и В. Если кривая задана уравнением х = (у)(с у d), то длина дуги АВ вычисляется по формуле где с и d — значения независимой переменной у в точках А и В.
— При нахождении центра масс также используются интегралы:
1) Координата центра масс системы материальных точек А1, А2 ,…, Аnс массами m1, m2, …, mn, расположенных на прямой в точках с координатами х1, х2, …, хn, находятся по формуле
2) При вычислении координаты центра масс можно любую часть фигуры заменить на материальную точку, поместив ее в центр масс этой части, и приписать ей массу, равную массе рассматриваемой части фигуры. Пример. Пусть вдоль стержня-отрезка [а;b] оси Ох — распределена масса плотностью (х), где (х) — непрерывная функция. Покажем, что а) суммарная масса М стержня равна ; б) координата центра масс х’ равна .
Разобьем отрезок [а; b] на n равных частей точками а= х0 < х1 < х2 < … <хn= b (рис. ). На каждом из n этих отрезков плотность можно считать при больших n постоянно и примерно равной (хk — 1) на k-м отрезке (в силу непрерывности (х). Тогда масса k-ого отрезка примерно равна а масса всего стержня равна
Считая каждый из n маленьких отрезков материальной точкой массы mk , помещенной в точке , получим по формуле (*), что координата центра масс приближенно находится так
Кроме физики интегралы достаточно важны в экономике. Далее приведены 4 доказывающих это примера:
1. Пусть для некоторого технологического процесса известно, какая электрическая мощность необходима для работы оборудования как функция времени. Обычно мощность измеряют в ваттах (Вт) или производных от нее единицах, например, киловаттах (кВт). Требуется оценить затраты на электроэнергию, связанные с производством. Если потребляемая мощность постоянна, например, включен один станок, который работает без перерыва от начала до конца цикла продолжительностью T (часов), то затраты на электроэнергию вычисляются по простой формуле cWT, где c — это стоимость одного киловатт-часа, W — мощность оборудования (в киловаттах).Если же потребляемая мощность в связи с технологическими особенностями процесса является функцией времени W(t), то написанная формула не применима. Для расчета мощности разобьем промежуток времени T на малые промежутки ∆ t, настолько малые, что функцию W(t) на них можно считать постоянной. На каждом из таких промежутков стоимость потребленной электроэнергии будет рассчитываться по рассмотренной формуле cW(t)∆ t, причем функция W(t) считается постоянной в пределах промежутка ∆ t, но для различных промежутков она имеет различные значения. Общая за все времяT стоимость электроэнергии составит сумму по всем промежуткам ∆ t. В пределе малых ∆ t сумма перейдет, согласно определению определенного интеграла в , то есть стоимость электроэнергии есть интеграл от произведения цены за один киловатт-час на потребляемую мощность, измеренную в киловаттах. Зная мощность и цену, можем вычислить производственные затраты. Аналогично вычисляются расходы воды, горючего и т. п.
2. Пусть издержки хранения на складе единицы продукции в единицу времени равны h, при этом количество хранимой продукции не постоянно, а меняется со временем (поступления и отгрузка) по закону f(t). Определить затраты на обслуживание склада. пределе для стоимости хранения получаем интеграл .
3. Для характеристики некоторой меняющейся со временем величины часто используют понятие среднего значения. Например, если известна динамика стоимости c(t) и количества N(t) проданных акций на бирже в течение дня, то среднее значение стоимости акции определяется как затраты на покупку всех проданных акций деленные на количество проданных акций. Как и в предыдущих примерах, здесь возникает суммирование по малым промежуткам времени, которое в пределе и переходит в интегрирование. Таким образом, средняя цена акции будет даваться выражением
:.
4.Пусть функция f(t) описывает производительность труда на некотором производстве с течением времени в пределах рабочей смены. Найдем объем продукции, произведенной за смену продолжительностью T( часов).Мы уже рассматривали экономический смысл производной и установили, что производительность труда есть производная от функции F(t), описывающей количество произведенной продукции от начала смены (). Соответственно , то есть объем произведенной продукции есть интеграл от производительности труда.
Также, интегралы применяются в строительстве и в естественных науках. В первом случае вычисляются геометрические параметры будущих строений, например, объем помещений или дополнительные, например закономерности морозного пучения грунтов. В естественных науках ведутся расчеты подъёмной слабости крыла курицы, исследование популяций, исследование дыхания в особых условиях, влияние невесомости на организм.
1.3 Обсуждение задачи
Итак, после анализа данного задачи можно сделать вывод, что цель, поставленная в этой курсовой работе, является важной. Благодаря тому, что интегральные вычисления используются в самых разных науках, программа, вычисляющая неопределенный интеграл, будет актуальна и сможет найти своего пользователя.
2. Выбор и обоснование численного метода решения задачи
2.1 Методы нахождения интеграла
Итак, изначально алгоритм принимает формулу интеграла, который требуется вычислить на промежутке от [-∞;+∞]. Это могут быть как обычные величины, например, x, так и тригонометрические: sin(x), cos(x). Такие интегралы вполне можно решить методом сведения интеграла к табличному, так называемой, подстановки под знак дифференциала. Например, если у нас есть интеграл , то решить его с помощью табличных интегралов нельзя. Но, если мы подставим выражение под знак дифференциала и приравняем новое выражение старому, мы получим: . В результате полученное выражение можно расценить как табличный интеграл №3, и получить ответ:, C — произвольная константа.
2.2 Математическая формулировка задачи
Требуется решить неопределенный интеграл, используя метод подведения под знак дифференциала.
Пусть требуется вычислить интеграл вида
|
где v(x) имеет очевидную первообразную V(x).
Тогда
∫ U(x) · v(x) dx = ∫ U(x) · V'(x) dx = ∫ U(x) dV(x) . |
Такого рода преобразование называется подведением под знак дифференциала, поскольку функция v(x) исчезает в интегрируемом выражении и появляется под знаком дифференциала в виде своей первообразной V(x).
Если функция U(x) выражается через функцию V(x) по некоторой формуле U(x) = w(V(x)), то
∫ U(x) dV(x) = ∫ w(V(x)) dV(x) = ∫ w(t) dt, |
где t = V(x). Таким образом отыскание исходного интеграла сводится к отысканию интеграла
∫ w(t) dt
В нем функция t = V(x) выступает как независимая переменная V, т. е. произошла замена переменной. Если интеграл
является табличным или известным образом сводится к табличному, т. е. можно найти некоторую первообразную Wфункции w, то
|
и искомый интеграл определяется формулой
|
3. Разработка алгоритма
3.1 Разработка структур данных
Для осуществления требуемой задачи требуется динамический массив, состоящий из строк. Каждая из этих строк будет содержать выражение, которое будет передаваться в подпрограмму обработки. Для выполнения задания был создан динамический массив, содержащий подстроки, на которые делится строка ввода, содержащая интегральное выражение и переменная логического типа для передачи результатов проверки ввода.
3.2 Разработка структуры алгоритма
Для осуществления поставленной задачи требуется разработать структуру, позволяющую пользователю ввести данные в виде символьного выражения, осуществить проверку ввода на корректность, затем разбить выражение на интегралы и циклично передать эти выражения в подпрограмму-анализатор. В данной подпрограмме будет создана система условий, позволяющая проверить введенный интеграл на совместимость с различными методами подстановки под знак дифференциала, и, выбрав наиболее подходящий, считать различные коэффициенты. Посчитав и преобразовав коэффициенты, мы можем сформировать окончательное выражение и вывести его на дисплей. Стоит заметить, что по мере выполнения задачи следует помнить о первоначальном знаке у выражения, сохранять его и учитывать при расчётах. Преобразование коэффициентов может быть реализовано выборкой их из первоначального выражения в подстроку поэлементно циклом и последующим переводом в целочисленный
3.3 Схема алгоритма
|
Ниже приведена схема алгоритма вычисления значения неопределенного интеграла методом подведения под знак дифференциала. (рис. 1-12).
|
|
|
|
|
Рисунок 1 – Схема алгоритма решения интеграла типа ‘xdx’
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рисунок 2 – Схема алгоритма решения степенного интеграла
|
|
|
|
Рисунок 3 – Схема алгоритма решения интеграла типа “x/((x^(2)+C’)
Рисунок 4 – Схема алгоритма решения экспоненциального интеграла
Рисунок 5 – Схема алгоритма решения интеграла “a^(x)”
Рисунок 6 – Схема алгоритма решения интеграла типа “sin(x)^(n)*cos(x)”
Рисунок 7 – Схема алгоритма решения интеграла типа cos(x) и cos(x)^(2)
Рисунок 7 – Схема чтения алгоритма интеграла типа sin(x)^(x)*cos(x)
Рисунок 8 – Схема алгоритма анализа интеграла табличного интеграла типа типа sin(x)^(x)*cos(x)
Рисунок 9 – Схема алгоритма решения интеграла типа sin(x)^(x)*cos(x)
Рисунок 10 – Схема алгоритма чтения табличных интеграла типа 1/(x^(2)+a^(2))
Рисунок 11 – Схема алгоритма анализа табличных интегралов 1/(x^(2)+a^(2))
Рисунок 12 – Схема алгоритма решения табличных интегралов 1/(x^(2)+a^(2))
4. Текст программы
4.1 Описание переменных и структур данных
Для выполнения расчёта неопределенного интеграла были созданы структуры arra=array of string[MaxSize] и ShString=string[MaxSize] и, соответственно, константы MaxSize=50 и maxcoordinates=255.
4.2 Описание функций
Программа делится на 5 подпрограмм:
procedure tabular_integrals (var arr: ShString;var flag:boolean); – анализ и решение интегралов методом подведения под знак дифференциала табличного интеграла. Структуры данных, используемых в подпрограмме tabular_integrals, приведены в таблицах 1-2.
Таблица 1 — Структуры данных, используемые в tabular_integrals
Имя |
Тип |
Предназначение |
формальные параметры |
||
arr |
ShString |
Строка, содержащая вводимое пользователем выражение |
flag |
boolean |
номер вводимого элемента |
локальные переменные |
||
x1 |
byte |
Переменная для анализа типа интеграла |
x0 |
byte |
Переменная для анализа типа интеграла |
x2 |
byte |
Переменная для анализа типа интеграла |
x3 |
byte |
Переменная для анализа типа интеграла |
x4 |
byte |
Переменная для анализа типа интеграла |
x5 |
byte |
Переменная для анализа типа интеграла |
x6 |
byte |
Переменная для анализа типа интеграла |
x7 |
byte |
Переменная для анализа типа интеграла |
f |
integer |
Переменная-счетчик позиций в строке |
pr |
integer |
Переменная для проверки ввода коэффициента |
z |
integer |
Переменная-счетчик позиций в строке |
j |
integer |
Переменная-счетчик позиций в строке |
start |
integer |
Координата начала считывания строки |
theend |
integer |
Координата конца считывания строки |
flag_of_ distribution Einz |
boolean |
Логическая переменная, для распределения считывания и анализа подстроки, содержащей коэффициенты. |
substr |
ShString |
Вспомогательная подстрока |
Таблица 2 — Структуры данных, используемые в tabular_integrals (продолжение)
flag_of_ distribution Zwei |
boolean |
Логическая переменная, для распределения считывания и анализа подстроки, содержащей коэффициенты. |
substr2 |
ShString |
Вспомогательная подстрока |
substr3 |
ShString |
Вспомогательная подстрока |
substr4 |
ShString |
Вспомогательная подстрока |
substrSymb |
ShString |
Вспомогательная подстрока |
numb |
real |
Вспомогательная переменная для хранения коэффициента элемента строки |
numbX |
real |
Вспомогательная переменная для хранения коэффициента перед X |
firstnumb |
real |
Вспомогательная переменная для хранения коэффициента перед выражением |
subnumb |
real |
Дополнительная переменная для расчета коэффициента перед выражением в интеграле типа sin(x)^(2)*cos(x) |
mark |
char |
переменная-символ, несущая знак исходного выражения |
procedure check_substr (substr:ShString;var number:real); –Считываение коэффициента из подстроки substr в переменную number. Структуры данных, используемых в подпрограмме check_substr, приведены в таблице 3.
Таблица 3 — Структуры данных, используемые в check_substr
Имя |
Тип |
Предназначение |
формальные параметры |
||
substr |
ShString |
Подстрока, содержащая некоторый коэффициент |
number |
real |
Считываемый коэффициент |
локальные переменные |
||
pr |
integer |
Переменная для проверки считывания коэффициента |
procedure find_numb(arr:string;start:integer;ended:string;var number:real); –Считываение коэффициента из строки arr, ограниченной переменными start и ended, в переменную number. Структуры данных, используемых в подпрограмме find_numb, приведены в таблице 4.
Таблица 4 — Структуры данных, используемые в find_numb
Имя |
Тип |
Предназначение |
формальные параметры |
||
arr |
ShString |
Cтрока, содержащая некоторый коэффициент |
number |
real |
Считываемый коэффициент |
start |
string |
Начальная позиция считывания |
ended |
string |
Конечная позиция считывания |
локальные переменные |
||
substr |
ShString |
Вспомогательная подстрока для считывания коэффициента |
procedure find_express(arr:string;start:integer;ended:string;var substr:Shstring);-
Считывание элементов строки arr, ограниченной переменными start и ended, в подстроку substr. Структуры данных, используемых в подпрограмме find_express, приведены в таблице 5.
Таблица 5 — Структуры данных, используемые в find_express
Имя |
Тип |
Предназначение |
формальные параметры |
||
arr |
ShString |
Cтрока, содержащая некоторый коэффициент |
substr |
ShString |
Вспомогательная подстрока для считывания коэффициента |
start |
string |
Начальная позиция считывания |
ended |
string |
Конечная позиция считывания |
4.3 Текст программы на языке программирования 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.
5. Тестовый ввод
5.1 Аналитическое решение и умозрительные результаты
Рассчитаем вручную несколько интегралов: “3x^(2)”, “3sin(2x)^(2)*3cos(2x)”, “3e^(2x)”. Для этого воспользуемся программой Wolfram Alpha (рис. 13).
Рисунок 13. Результаты аналитического решения.
5.2 Решение, полученное с использованием разработанного ПО.
Теперь, получив результаты аналитического решения, мы можем сравнить их с результатами, полученными в процессе выполнения программы (рис.13).
Рисунок 13 – Результаты тестового ввода данных в программу.
5.3 Выводы
Результаты аналитического решения и тестового ввода совпадают, можно сделать суждение о том, что в данном конкретном тестовом вводе программа работает корректно.
5. Инструкция пользователю
Данная программа производит вычисление интеграла мтодом подведения под знак дифференциала. Пользователь должен ввести в строку ввода интегральное выражение, затем программа анализирует его и при решении выводит результаты. Все правила ввода указаны в окне программы. Кроме того, пользователь может воспользоваться дополнительным окном ввода, расположенном справа на форме. В случае правильного ввода программа выведет решенный интеграл в строку вывода, откуда ими уже можно пользоваться. В случае же ошибки программой будет выведено сообщение с причиной ошибки.
Заключение
Выполняя данную курсовую работу, я детально изучил понятие интеграла, его применение на практике и в повседневной жизни. Мною было доказано, что применение данного интеграла существенно помогает оптимизировать почти любую задачу. Для решения задачи, поставленной в курсовой работе был использован среда программирования Delphi 7, язык Оbject Pascal, что позволило существенно упростить реализацию программмы, решающей неопределенный интеграл методом подведения под знак дифференциала. В заключении можно сказать, что численные методы присутствуют везде и поэтому знать основные методы и способы их реализации очень полезно.