Почему проще загрузить компьютер циклом расчетов чем посчитать вручную

Обновлено: 07.07.2024

Решить задачу для математической модели - значит указать алгоритм для получения требуемого результата из исходных данных.

Алгоритмы решения условно делятся на:

точные алгоритмы, которые позволяют получить конечный результат за конечное число действий;

приближенные методы - позволяют за счет некоторых допущений свести решение к задаче с точным результатом;

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

Решение задач строительной механики связано с большими математическими трудностями, которые преодолеваются с помощью численных методов, позволяющих с применением ЭВМ получать приближенные, но удовлетворяющие практическим целям решения [2].

Численное решение получают путем дискретизации и алгебраизации краевой задачи. Дискретизация - замена непрерывного набора дискретным множеством точек. Эти точки называют узлами сетки, и только в них ищут значения функции. При этом функция заменяется конечным множеством ее значений в узлах сетки. Используя значения в узлах сетки можно приближенно выразить частные производные. В результате дифференциальное уравнение в частных производных преобразуется в алгебраические уравнения (алгебраизация краевой задачи).

В зависимости от способов выполнения дискретизации и алгебраизации выделяют различные методы.

Первым методом решения краевых задач, получившим широкое распространение, является метод конечных разностей (МКР). В данном методе дискретизация заключается в покрытии области решения сеткой и замене непрерывного множества точек дискретным множеством. Часто используется сетка с постоянными величинами шага (регулярная сетка).

Алгоритм МКР состоит из трех этапов:

  • 1. Построение сетки в заданной области. В узлах сетки определяются приближенные значения функции (узловые значения). Набор узловых значений - сеточная функция.
  • 2. Частные производные заменяются разностными выражениями. При этом непрерывная функция аппроксимируется сеточной функцией. В результате получают систему алгебраических уравнений.
  • 3. Решение полученной системы алгебраических уравнений.

Еще одним численным методом является метод граничных элементов (МГЭ). Он основывается на рассматривании системы уравнений, включающей только значения переменных на границах области. Схема дискретизации требует разбиения лишь поверхности. Граница области делится на ряд элементов и считается, что нужно найти приближённое решение, которое аппроксимирует исходную краевую задачу. Эти элементы называются граничными. Дискретизация только границы ведет к меньшей системе уравнений задачи, чем дискретизация всего тела. МГЭ уменьшает размерность исходной задачи на единицу.

При проектировании различных технических объектов широко используется метод конечных элементов (МКЭ). Возникновение метода конечных элементов связано с решением задач космических исследований в 1950-х годах [3]. В настоящее время область применения метода конечных элементов очень обширна и схватывает все физические задачи, которые могут быть описаны дифференциальными уравнениями. Наиболее важными преимуществами метода конечных элементов являются следующие:

  • 1. Свойства материалов смежных элементов не должны быть обязательно одинаковыми. Это позволяет применять метод к телам, составленным из нескольких материалов.
  • 2. Криволинейная область может быть аппроксимирована с помощью прямолинейных элементов или описана точно с помощью криволинейных элементов.
  • 3. Размеры элементов могут быть переменными. Это позволяет укрупнить или измельчить сеть разбиения области на элементы, если в этом есть необходимость.
  • 4. С помощью метода конечных элементов не представляет труда рассмотрение граничных условий с разрывной поверхностной нагрузкой, а также смешанных граничных условий.

Решение задач по МКЭ содержит следующие этапы:

  • 1. Разбиение заданной области на конечные элементы. Нумерация узлов и элементов.
  • 2. Построение матриц жесткости конечных элементов.
  • 3. Сведение нагрузок и воздействий, приложенных к конечным элементам, к узловым силам.
  • 4. Формирование общей системы уравнений; учет в ней граничных условий. Решение полученной системы уравнений.
  • 5. Определение напряжений и деформаций в конечных элементах.

Основной недостаток МКЭ -- необходимость дискретизации всего тела, что ведет к большому количеству конечных элементов, и, следовательно, неизвестных задачи. Кроме того, МКЭ иногда приводит к разрывам значений исследуемых величин, поскольку процедура метода налагает условия неразрывности лишь в узлах.

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

Допустим, нам требуется найти точку, в которой пересекаются две функции. Для большей простоты будем искать точку пересечения двух прямых, заданных уравнениями y(x) = 2*x + 1 и g(x) = 5 - x. С этой задачей в первый раз можно столкнуться в школе, примерно в 6-7 классе при изучении графиков функций.

С помощью графического решение можно уточнить количество корней и примерное их значение. А вот аналитическое решение уже дает точные результаты. Лучше всего совмещать два таких решения, так как вы будете получать и визуальное представление, и точное решение.

Итак, решим эту задачу следующим образом:

Давайте посмотрим на рисунок, чтобы убедиться, что графики пересекаются именно в этой одной точке, координаты которой у нас уже есть перед глазами:

Казалось бы, если мы имеем простое аналитическое решение, то зачем нужно применять численные методы? Зачем искать решение методом перебора и тратить на это драгоценные такты процессора?

Давайте теперь рассмотрим немного другой пример

Построим график, который будет показывать нам, что решение уравнения y(x) = g(x) эквивалентно решению уравнения f(x) = 0, где f(x) = y(x) - g(x).

Именно в этом случае проще будет написать код, который в определенной области переберет все решения. В обоих случаях хорошо видно, что корень принадлежит интервалу [1; 2]. Значит на нем мы и можем начать поиск решения.

Первый метод: простой перебор

x_start - начальное значение диапазона, x_end - конечное значение для x. Между этими значениями будем искать решение. eps - наперед заданная погрешность. x - текущая переменная, которая вначале равна x_start , а затем каждый раз увеличивается на dx . Цикл while() выполняется до тех пор, пока x не дойдет до конца заданного интервала, то есть до x_end . В цикле каждый раз проверяется момент, когда абсолютная разница между функциями в текущей точке не станет меньше допустимой погрешности. Именно в этот момент осуществляется выход. И это будет момент нахождения ближайшего решения к точке x_start .

Внимание : если вы попробуете прописать в условии if ( y(x) == g(x) ) , то у вас никогда не зайдет в ветку if , т.к. при вычислениях в десятичных дробях всегда теряется точность. Поэтому вероятность того, что y(x) сравняется с g(x) в точности до последнего знака стремится к нулю. А если же они будут отличаться даже в 10-м знаке после запятой, то оператор "==" будет давать false и не станет заходить в ветку. То есть всегда считается через допустимую погрешность.

Вызываем нашу функцию с нужным диапазоном и получаем ответ в виде координат точки пересечения. Код написан на Python 3. Вызываем нашу функцию с нужным диапазоном и получаем ответ в виде координат точки пересечения. Код написан на Python 3.

И вроде всё нормально в этом решении. Оно небольшое, дает вполне точный ответ. Проблема только в том, что из-за маленького шага dx, программе нужно совершить 20935 итераций, чтобы получить ответ с заданной точностью. И это довольно большое число, которое нужно стремиться уменьшить.

Лучше всего для этого подойдет модификация перебора в виде метода половинного деления (метод бисекции, метод дихотомии). Немного теории почитать можно здесь . На википедию не даю даже ссылку, потому что считаю этот сайт поганым для изучения физико-математических проблем или алгоритмов. Мало того, что статьи там нагло передирают из книг, да еще и самым сложным образом, не объясняя сопутствующих терминов, и делая кучи ошибок. Поэтому советую искать хорошие книги или простые статьи.

В двух словах о методе бисекции

Если мы четко знаем, что функция f(x) на некотором отрезке [a; b] имеет единственный корень, то значение функции на краях этого интервала всегда имеют противоположные знаки. Где какой - зависит от убывания или возрастания функции. Но одно выражение легко позволяет проверить верность этого условия, если мы напишем f(a) * f(b) < 0 . Только в случае разных знаков произведение всегда будет отрицательно, а в случае одинаковых знаков - положительно. Далее мы вычисляем середину интервала xm = (a + b) / 2 . А затем проверяем условия:

1. Если f(a) * f(xm) < 0 - верно, тогда корень лежит на интервале [a; xm] и нам необходимо точку b (текущий правый край нашего интервала поиска) сдвинуть в точку xm, тем самым сузив интервал поиска в два раза. Делается это присваиванием b = xm. В результате мы получаем интервал [a ; (a + b)/2 ] . И повторяем поиск на нем.

2. Если f(xm) * f(b) < 0 - верно, тогда корень лежит на интервале [xm; b] и нам необходимо точку a (текущий левый край нашего интервала поиска) сдвинуть в точку xm, тем самым сузив интервал поиска в два раза. Делается это присваиванием a = xm. В результате мы получаем интервал [(a + b)/2; b ] . И повторяем поиск на нем.

В итоге, каждый раз проверяя значение нашей функции в середине интервала, мы получаем условие, когда |f(xm)| не будет превышать заданную погрешность, что будет означать достижение решения.

Реализация метода половинного деления (дихотомии, бисекции). Более быстрое решение нелинейного уравнения, нахождение корней за 12 итераций. Код написан на Python 3 Реализация метода половинного деления (дихотомии, бисекции). Более быстрое решение нелинейного уравнения, нахождение корней за 12 итераций. Код написан на Python 3

С аналогичной точностью eps = 0.0001 мы получаем решение задачи за 12 итераций, что даже на интерпретируемом языке выполняться будет вполне быстро.

Выводы

1. Если задачу можно решить аналитически, то лучше её решить аналитически и закодить в программе готовую функцию, выдающую ответ по выведенной вами формуле. Это будет быстрее всего.

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

А чем вам помогают численные методы? Сталкивались ли вы уже с ними? Напишите об этом в комментариях! :)

Спасибо, что дочитали до конца :) Если вам нравятся такие разборы, и вы хотите видеть их чаще, то оставьте обратную связь (лайки, комментарии, ваши мысли).

Численные методы являются одним из мощных математических средств решения задачи. Простейшие численные методы мы используем всюду, например» извлекая квадратный корень на листке бумаги. Есть задачи, где без достаточно сложных численных методов не удалось бы получить ответа; классический пример—открытие Нептуна по аномалиям движения Урана.

В современной физике таких задач много- Более того, часто требуется выполнить огромное число действий за короткое время, иначе ответ будет не нужен. Например, суточный прогноз погоды должен быть вычислен за несколько часов; коррекцию траектории ракеты надо рассчитать за несколько минут (напомним, что для расчета орбиты Нептуна Леверье потребовалось полгода); режим работы прокатного стана должен исправляться за секунды. Это немыслимо без мощных ЭВМ, выполняющих тысячи или даже миллионы операций в секунду.

Современные численные методы и мощные ЭВМ дали возможность решать такие задачи, о которых полвека назад могли только мечтать. Но применять численные методы далеко не просто. Цифровые ЭВМ умеют выполнять только арифметические действия и логические операции. Поэтому помимо разработки математической модели, требуется еще разработка алгоритма, сводящего все вычисления к последовательности арифметических и логических действий. Выбирать модель и алгоритм надо с учетом скорости и объема памяти ЭВМ: чересчур сложная модель может оказаться машине не под силу, а слишком простая — не даст физической точности.

Сам алгоритм и программа для ЭВМ должны быть тщательно проверены. Даже проверка программы нелегка, о чем свидетельствует популярное утверждение: «В любой сколь угодно малой программе есть, по меньшей мере, одна ошибка». Проверка алгоритма еще более трудна, ибо для сложных алгоритмов не часто удается доказать сходимость классическими методами. Приходится использовать более или менее надежные «экспериментальные» проверки, проводя пробные расчеты на ЭВМ и анализируя их.

Строгое математическое обоснование алгоритма редко бывает исчерпывающим исследованием. Например, большинство доказательств сходимости итерационных процессов справедливо только при точном выполнении всех вычислений; практически же число сохраняемых десятичных знаков редко происходит 5 — 6 при «ручных» вычислениях и 10—12 при вычислениях на ЭВМ. Плохо поддаются теоретическому исследованию «маленькие хитрости» — незначительные на первый взгляд детали алгоритма, сильно влияющие на его эффективность. Поэтому окончательную оценку метода можно дать только после опробования его в практических расчетах.

К чему приводит пренебрежение этими правилами — видно из принципа некомпетентности Питера: «ЭВМ многократно увеличивает некомпетентность вычислителя».

Для сложных задач разработка численных методов и составление программ для ЭВМ очень трудоемки и занимают от нескольких недель до нескольких лет. Стоимость комплекса отлаженных программ нередко сравнима со стоимостью экспериментальной физической установки. Зато проведение отдельного расчета по такому комплексу много быстрей и дешевле, чем проведение отдельного эксперимента. Такие комплексы позволяют подбирать оптимальные параметры исследуемых конструкций, что не под силу эксперименту.

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

Современный физик или инженер-конструктор для успешной работы должен одинаково хорошо владеть и «классическими» методами, и численными методами математики.

2. Турбо Паскаль

Язык Паскаль с момента своего создания Н. Виртом в 1971 году играет особую роль и в практическом программировании, и в его изучении. С непревзойденной четкостью в нем реализованы принципы структурного программирования. Паскаль стал первым языком, с которым знакомиться большинство будущих программистов.

Трансляторы для программ, написанных на Паскале, разработаны для различных компьютеров и в настоящее время имеют множество разновидностей. Они являются компиляторами, обрабатывающие разработанные программистами тексты программ.

Схематически программа представляется в виде последовательности восьми разделов:

1. Заголовок программы

2. Описание внешних модулей, процедур и функций

3. Описание меток

4. Описание констант

5. Описание типов переменных

6. Описание переменных

7. Описание функций и процедур

8. Раздел операторов

Разработка программы по схеме алгоритма

При разработке программы в данной работе используются следующие операторы и стандартные процедуры:

Program - Заголовок программы

Uses – раздел подключения модулей

Begin – открывающая логическая скобка

End – закрывающая логическая скобка

Crt - (Cathod ray tube - электронно-лучевая трубка) один из наиболее часто используемых модулей. Он содержит процедуры обслуживания процессов вывода информации на экран, ввода с клавиатуры, а также процедуры и функции вывода звуковых сигналов, работы с окнами на экране и вывода цветных текстовых строк на экран.

Graph – графический модуль для вывода базовых графических элементов, таких как точки, отрезки прямых линий, дуги и целые окружности и других графических элементов, называемых графическими примитивами

Var – раздел описания переменных

Writeln, Write – операторы вывода информации

Readln, Read – операторы ввода информации

If <условие> then <оператор>– оператор условного перехода

For <параметр>:=<нач.знач.> to <конечн.знач.> do <оператор> – оператор цикла с параметром

Repeat <оператор> until <условие> - оператор цикла с постусловием

Clrscr – очистка экрана

Initgraph – процедура инициализации графического режима

Closegraph – процедура закрытия графического режима

Line (x1, y1, x2, y2) – соединение двух точек отрезком

Putpixel (x, y, c) – построение точки (x, y) цветом с

Readkey – оператор считывание кода клавиш

Outtextxy (x, y, st) – вывод строки st, начиная с точки (x,y)

Getmaxx – результатом этой функции будет max значение x в данном видеорежиме

Goto – перейти к

+ - арифметическая операция сложения

- - арифметическая операция вычитания

* - арифметическая операция умножения

/ - арифметическая операция деления

Описание переменных и констант используемых в алгоритме


n – количество узлов в таблице, не считая начальную точку ;


- значения узлов записанных в одномерные массивы;

D – переменная, используемая для нахождения значения полинома Ньютона в этой точке;

L – переменная значения полинома Ньютона

k, step – константы используемые для построения графика полинома;

u – переменная шага деления графика;

Для описания алгоритма в данной курсовой работе были пронумерованы символы.

Инструкция пользования программой

Для запуска программы необходимо дважды щелкнуть на ярлыке с именем Niton.exe. После этого на экран будет выведен титульный лист. Чтобы продолжить надо нажать клавишу Enter.

Следующим шагом в окне программы будет показана строка с текстом «Показать пояснения к программе (1/0)?», чтобы увидеть их следует нажать 1 и подтвердить ввод нажатием клавиши Enter. Чтобы продолжить надо нажать клавишу Enter. Сразу после этого в диалоговом окне появится строка «Введите количество уpлов n (N=n+1)», где нужно указать количество (N-1) узлов таблицы и нажать Enter. Далее надо будет ввести значения из таблицы, по окончанию ввода нажать Enter.

На экран будет выведена введённая таблица значений. Затем пользователю будет предложено «Введите x ». Нужно ввести x для которого необходимо найти приближённое значение. После этого программа вычислит значение и предложит найти значения для другого x.

Дальше программа попросит ввести шаг деления графика. После ввода шага программа построит график полинома. Для продолжения нужно нажать Enter.

Потом программа спросит «повторить вычисления и построения графика полинома для другой функции?» Чтобы начать заново нужно нажать 1, чтобы закончить работу с программой нажать 0 и после ввода подтвердить выбор клавишей Enter.

Численные методы представляют собой отдельную область математики и применяются в различных прикладных направлениях. В частности, с помощью численных методов решаются и проблемы прикладной оптики. В данном пособии приводится обзор основных численных методов, чаще всего используемых при решении задач прикладной оптики. Особенностью пособия является использование в качестве заданий не просто математических функций, а реальных задач из области прикладной оптики, на примере которых рассматриваются численные методы. Это дает не только хорошее понимание сути самих численных методов, но и особенности их применения на практике.

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

Физическая постановка задачи. На этом этапе необходимо грамотно сформулировать и поставить задачу с точки зрения физики процесса. Для этого необходимо изучить рассматриваемую проблему и обладать знаниями в соответствующей области.

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

Метод непрерывной математики. На этом этапе оперируют не конечными числами, а функциями, общими величинами, то есть ищут решение проблемы в общем виде, и описывают при помощи математических формул.

Численные методы. Решение проблемы представляют в виде конечных математических операций – сложение, умножение. Численные методы позволяют свести решение задачи к выполнению конечного количества арифметических действий над числами, при этом результаты получаются в виде числовых значений. Чаще всего возможно использование известных стандартных численных методов.

Алгоритмизация. Алгоритмизация служит для упорядочения производимых действий в виде точного формального описания процесса. Алгоритм можно изобразить в виде блок-схемы или описать другим способом.

Программирование. На этом этапе алгоритм реализуется на каком-нибудь языке программирования высокого уровня.

Отладка программы. На этом этапе выполняется поиск ошибок, которые могли появиться на предыдущих этапах. Программа испытывается на решении тестовых задач для получения уверенности в достоверности результатов. Вполне вероятно, что придется вернуться в самое начало, к изменению физической постановки задачи, или какому-то другому этапу.

Проведение расчетов. На этом этапе готовятся исходные данные для расчетов, и проводятся вычисления по отлаженной программе.

Анализ результатов. Результаты расчетов анализируются, оформляется научно-техническая документация.

Все численные методы обладают некоторым набором характеристик. Наиболее важной из них является точность. На всех этапах решения задачи могут возникать погрешности, искажающие результаты вычислений, которые и определяют точность. Причины возникновения вычислительных погрешностей и способы их устранения рассматриваются в Приложении А.

При анализе точности одним из важнейших критериев является сходимость численного метода. Для дискретных методов (методы, которые заключаются в замене задачи с непрерывными функциями на задачу, в которой значения функций заданы в фиксированных точках) сходимость – это стремление значений решения метода к соответствующим значениям решения исходной задачи при стремлении к нулю параметра дискретизации (например, шага интегрирования).

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

Устойчивость – это чувствительность метода к неточностям в исходных данных. Задача называется устойчивой, если малые погрешности в исходной величине приводят к малым погрешностям в решении. Отсутствие устойчивости означает, что даже незначительные погрешности в исходных данных приводят к большим погрешностям в решении или даже к неверному результату. О неустойчивых задачах также говорят, что они чувствительны к погрешностям исходных данных.

Таким образом, для получения решения задачи с необходимой точностью ее постановка должна быть корректной, а используемый численный метод должен обладать устойчивостью (корректностью) и сходимостью.

В большинстве случаев, кроме точности (сходимости, устойчивости, корректности) необходимо следить за минимизацией трудоемкости решения. Применительно к вычислительным задачам трудоемкость определяется объёмом памяти, используемым в процессе поиска решения, и временем, необходимым для выполнения вычислений. Время обычно измеряется в количестве элементарных операций (сложения, умножения, и т.д.), которые необходимо выполнить для решения задачи. Эти характеристики желательно уменьшать построением оптимальных алгоритмов вычисления, не потеряв при этом в точности. К сожалению, часто уменьшение трудоемкости и увеличение точности являются взаимоисключающими параметрами, и главной задачей является найти баланс между ними.

Читайте также: