Как сделать курсач по информатике! Да легко!
Задача звучит следующим образом:
Экспериментально установлено, что зависимость угла закручивания φ плоской спиральной пружины от приложенной силы 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 так, что:
Вычислим два значения функции в двух новых точках. Сравнением определим в какой из двух новых точек значение функции максимально. Отбросим тот из концов изначального отрезка, к которому точка с максимальным значением функции оказалась ближе (мы ищем минимум👀).
Если:
то берётся отрезок:
а отрезок:
отбрасывается.
Иначе берётся зеркальный относительно середины отрезок:
а отбрасывается:
Процедура повторяется, пока не будет достигнута заданная точность, к примеру, пока длина отрезка не достигнет удвоенного значения заданной погрешности.
На каждой итерации приходится вычислять новые точки. Можно добиться того, чтобы на очередной итерации было необходимо высчитывать лишь одну новую точку, что заметно способствовало бы оптимизации процедуры. Это достигается путём зеркального деления отрезка в золотом сечении , в этом смысле метод золотого сечения можно рассматривать, как улучшение метода дихотомии с параметром:
Переходим к практике. Теория довольно утомительная🤦♂️
Разработка алгоритма функции вычисления корня уравнения
Теперь приступаем к разработке алгоритма😎. Как работает метод дихотомии? Довольно просто:
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:
Еще немного теории и приступаем к кодингу.
Дихотомическое деление привлекательно своей простотой. Действительно, при дихотомии мы всегда имеем дело лишь с двумя классами, которые исчерпывают объём делимого понятия. Таким образом, дихотомическое деление всегда соразмерно; члены деления исключают друг друга, так как каждый объект делимого множества попадает только в один из классов а или не а; деление проводится по одному основанию — наличие или отсутствие некоторого признака. Обозначив делимое понятие буквой а и выделив в его объёме некоторый вид, скажем, b, можно разделить объём а на две части — b и не b.
Дихотомическое деление имеет недостаток: при делении объёма понятия на два противоречащих понятия каждый раз остаётся крайне неопределённой та его часть, к которой относится частица «не». Если разделить учёных на историков и не историков, то вторая группа оказывается весьма неясной. Кроме того, если в начале дихотомического деления обычно довольно легко установить наличие противоречащего понятия, то по мере удаления от первой пары понятий найти его становится всё труднее.
Пишем программу на Паскале
Запускаем Delphi. Можно использовать Турбо Паскаль 7, но интерфейс там еще под DOS, так что лучше воспользоваться более современным аналогом Delphi. Можно писать консольное приложение, можно с кнопками. Сделаем по-дурацки и сделаем приложение под Windows с функциональностью «как под DOS»👴🧓.
Говоря о современности, конечно, немного лукавим, но такова современность в наших ВУЗах. Да-да, пишем в 2021:
Кидаем на форму компоненты Tmemo и Tbutton:
Определим переменные и константы, также введем функцию f:
Функция F выглядит следующим образом:
Теперь для каждой из кнопок делаем похожий обработчик:
Для всех кнопок будет похоже — отличия лишь и в исходных данных и диапазоне изменения [a;b].
Теперь делаем обработчик для самой главной кнопки:
Что происходит? Все очень просто. Сначала определяем точность вычисления, диапазон аргумента. Далее следует алгоритм дихотомии и вывод значения!
Запускаем программу и пробуем считать🖥.
Проверим вычисления в MathCAD
В маткаде использовать метод дихотомии не будем. Там все считается гораздо проще✨.
Введем известные значения и формулу на лист. Найдем приближенно корень с помощью функции root.
Заодно построим и график:
Можно проверять для разных вариантов, результаты сходятся в пределах погрешностей😁😁😁