Найти тему

Как решить задачу с использованием численных методов? Создание программы на Паскале и MathCAD

Оглавление

Как сделать курсач по информатике! Да легко!

Задача звучит следующим образом:

Экспериментально установлено, что зависимость угла закручивания φ плоской спиральной пружины от приложенной силы F можно рассчитать по формуле

ϕ = A F + B exp(CF), где A, B и C − коэффициенты, определяющиеся конструктивными параметрами пружины. При подстановке в формулу значения силы F в ньютонах угол φ определяется в градусах.

Задавшись приведенными в таблице коэффициентами A, B и C, определите силу F, удовлетворяющую указанному значению φ.

Иллюстрация пружины
Иллюстрация пружины

Есть следующие варианты исходных данных. Они ничем особо не отличаются — просто разные числовые значения. Вычислим их все!

Таблица с исходными данными:

Варианты входных данных
Варианты входных данных

Определим входные и выходные данные

✔Входные данные — это то, что подается на вход программы. Таким образом, у нас есть коэффициенты A, B и C − коэффициенты, определяющиеся конструктивными параметрами пружины, а также число ϕ — угол закручивания плоской спиральной пружины в градусах.

✔Выходные данные — это сам результат вычислений (приложенная сила) F.

Исходное уравнение можно представить в удобном для решения виде:

Наша функция
Наша функция

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

Подставив известные значения, получим функцию для расчета:

F:=a*f+b*exp(c*f)-fi

В таком виде ее уже можно использовать в программе на Паскале!

Как работает метод дихотомии? Как работает бисекция? Что за деление отрезка пополам?

Сейчас разберемся 😉

Дихотоми́я (греч. διχοτομία: δῐχῆ, «надвое» + τομή, «деление») — раздвоенность, последовательное деление на две части, не связанные между собой✨✨✨.

Мур-мур-мур, так сказать
Мур-мур-мур, так сказать

Способ логического деления класса на подклассы, который состоит в том, что делимое понятие полностью делится на два взаимоисключающих понятия. Дихотомическое деление в математике, философии, логике и лингвистике является способом образования взаимоисключающих подразделов одного понятия или термина и служит для образования классификации элементов.🤷‍♀️

Правильное решение уравнения методом половинного деления возможно лишь в том случае, если известно, что на заданном интервале имеется корень и он является единственным. Это совсем не означает что метод дихотомии может использоваться только для решения линейных уравнений. Для нахождения корней уравнений более высокого порядка методом половинного деления необходимо сначала отделить корни по отрезкам. Процесс отделения корней осуществляется путем отыскания первой и второй производной от функции и приравнивании их нулю f'(x)=0 и f''(x)=0. Далее определяются знаки f(x) в критических и граничных точках. Интервал, где функция меняет знак |a,b|, где f(a)*f(b)< 0.

Метод дихотомии несколько схож с методом бисекции, однако отличается от него критерием отбрасывания концов.

Пусть задана функция

функция
функция

Разобьём мысленно заданный отрезок пополам и возьмём две симметричные относительно центра точки x1 и x2 так, что:

-6

Вычислим два значения функции в двух новых точках. Сравнением определим в какой из двух новых точек значение функции максимально. Отбросим тот из концов изначального отрезка, к которому точка с максимальным значением функции оказалась ближе (мы ищем минимум👀).

Если:

-7

то берётся отрезок:

-8

а отрезок:

-9

отбрасывается.

Иначе берётся зеркальный относительно середины отрезок:

-10

а отбрасывается:

-11

Процедура повторяется, пока не будет достигнута заданная точность, к примеру, пока длина отрезка не достигнет удвоенного значения заданной погрешности.

На каждой итерации приходится вычислять новые точки. Можно добиться того, чтобы на очередной итерации было необходимо высчитывать лишь одну новую точку, что заметно способствовало бы оптимизации процедуры. Это достигается путём зеркального деления отрезка в золотом сечении , в этом смысле метод золотого сечения можно рассматривать, как улучшение метода дихотомии с параметром:

-12

Переходим к практике. Теория довольно утомительная🤦‍♂️

Разработка алгоритма функции вычисления корня уравнения

Теперь приступаем к разработке алгоритма😎. Как работает метод дихотомии? Довольно просто:

1️⃣Найдем середину отрезка [a; b]: c=(a+b)/2;

2️⃣Вычислим значения функции в точках a и c и найдем произведение полученных значений: d=f(c)ּf(a);

3️⃣Если d>0, то теперь точкой a станет c: a=c; Если d<0, то точкой b станет c: b=c;

4️⃣Вычислим разность a и b, сравним ее с точностью ε: если |a-b|> ε, то идем в пункт 1) если нет, то корень с нужной нам точностью найден, и он равен: x=(a+b)/2;

Для наглядности изобразим блок-схему в программе Microsoft Visio:

Рисуем блок-схему в программе Microsoft Visio
Рисуем блок-схему в программе Microsoft Visio

Еще немного теории и приступаем к кодингу.

Дихотомическое деление привлекательно своей простотой. Дей­ствительно, при дихотомии мы всегда имеем дело лишь с двумя классами, которые исчерпывают объём делимого понятия. Таким образом, дихотомичес­кое деление всегда соразмерно; члены деления исключают друг друга, так как каждый объект делимого множества попадает только в один из классов а или не а; деление проводится по одному основа­нию — наличие или отсутствие некоторого признака. Обозначив делимое понятие буквой а и выделив в его объёме некоторый вид, скажем, b, можно разделить объём а на две части — b и не b.

Дихотомическое деление имеет недостаток: при делении объё­ма понятия на два противоречащих понятия каждый раз остаётся крайне неопределённой та его часть, к которой относится части­ца «не». Если разделить учёных на историков и не историков, то вторая группа оказывается весьма неясной. Кроме того, если в начале дихотомического деления обычно довольно легко устано­вить наличие противоречащего понятия, то по мере удаления от первой пары понятий найти его становится всё труднее.

Пишем программу на Паскале

Запускаем Delphi. Можно использовать Турбо Паскаль 7, но интерфейс там еще под DOS, так что лучше воспользоваться более современным аналогом Delphi. Можно писать консольное приложение, можно с кнопками. Сделаем по-дурацки и сделаем приложение под Windows с функциональностью «как под DOS»👴🧓.

Говоря о современности, конечно, немного лукавим, но такова современность в наших ВУЗах. Да-да, пишем в 2021:

олдскул
олдскул

Кидаем на форму компоненты Tmemo и Tbutton:

Готовая форма
Готовая форма

Определим переменные и константы, также введем функцию f:

Переменные для вычисления все типа real и extended, т.е. вещественные числа с двойной точностью
Переменные для вычисления все типа real и extended, т.е. вещественные числа с двойной точностью

Функция F выглядит следующим образом:

-17

Теперь для каждой из кнопок делаем похожий обработчик:

-18

Для всех кнопок будет похоже — отличия лишь и в исходных данных и диапазоне изменения [a;b].

Теперь делаем обработчик для самой главной кнопки:

-19

Что происходит? Все очень просто. Сначала определяем точность вычисления, диапазон аргумента. Далее следует алгоритм дихотомии и вывод значения!

-20

Запускаем программу и пробуем считать🖥.

Ого! Работает!
Ого! Работает!

Проверим вычисления в MathCAD

В маткаде использовать метод дихотомии не будем. Там все считается гораздо проще✨.

Введем известные значения и формулу на лист. Найдем приближенно корень с помощью функции root.

Хоба!
Хоба!

Заодно построим и график:

-23

Можно проверять для разных вариантов, результаты сходятся в пределах погрешностей😁😁😁