Цель лекции: Показать отличия научного программирования от офисного программирования.
Изначально программирование предназначалось для решения именно научных и инженерных задач. Но с развитием вычислительной техники задачи, которые решались с помощью компьютеров, стали значительно шире. В настоящее время офисное программирование, программирование компьютерных игр, поисковые системы, компьютерная графика, базы данных - далеко не полный спектр решаемых на компьютерах задач. Программирование этих и многих других задач существенно отличается от программирования научных расчетов. Поэтому имеет смысл выделять научное программирование, как отдельный стиль программирования.
Что значит научное программирование? Прежде всего, научное программирование должно быть ориентировано на эффективное и корректное решение поставленной задачи. Можно возразить, что эти требования предъявляются ко всем программным средствам. Однако вопрос в приоритете критериев. Скажем, если офисная программа будет работать не 0,25 секунд, а 1 секунду для обработки операции, то это не так критично, как скажем проведение расчета в течение недели или месяца. Тоже самое и на счет корректности выполнения программы. Одно дело, когда "зависнет" компьютерная игра, и совсем другое дело, если в ходе вычислений будет ошибка, которая приведет к неверным выводам или технологическим катастрофам.
Приведем некоторые моменты, которые следует иметь в виду, приступая к программированию научных задач.
Отделение научной части от интерфейсной. Мы призываем придерживаться правила: одна программа производит численный расчет, сохраняя результаты расчета, а другая программа осуществляет визуализацию полученных данных.
Оптимизация текстов программ. Очень часто небольшое изменение в тексте программы позволяет кардинально увеличить скорость расчетов. Оптимизирующий компилятор не всесилен.
Не использовать внешние подпрограммы и библиотеки. За исключением особых случаев старайтесь программировать используемые алгоритмы сами. Во-первых, это даст исчерпывающее понимание самого численного метода, а, во-вторых, реализуя "для себя" можно добиться наилучшего результата.
Жертвуйте универсальностью в угоду эффективности. Универсальность одно из самых любимых достижений программирования, но для научного программирования построение универсальных программных комплексов оправдано не всегда.
Используйте современные компиляторы. Далеко не все можно оптимизировать "руками" - современные оптимизирующие компиляторы могут серьезно увеличить скорость.
Обсудим вопрос выбора языка программирования. Мы в нашем курсе систематически используем язык C#. Издавна языком для научных расчетов являлся Фортран. Действительно, этот язык имеет много преимуществ, но еще больше недостатков. Таких как:
Язык старого поколения. Этот язык был разработан на заре компьютерной эры, поэтому многие важные технологии программирования, такие как модульность, контроль типов и др. в нем не реализованы. Что приводит к ошибкам и трудностям при программировании.
Многие библиотеки подпрограмм уже устарели. Прогресс в компьютерной сфере происходит крайне быстро. Поэтому библиотеки разработаны для устаревших ЭВМ могут быть бесполезны.
Отсутствие мобильности. Не смотря на существующие стандарты языка, конкретные реализации этого языка существенно отличаются.
Выбор языка C# мотивируется следующими факторами:
Современный язык. Программирование это та область, в которой прогресс происходит очень быстро. Язык C# с одной стороны вобрал в себя лучшие черты языков C++ и Java, а с другой был создан без необходимости поддерживать совместимость с предыдущими версиями
Мощность платформы .NET. Язык C# является основным языком платформы .NET, поэтому при программировании на C# вы программируете также и на платформе .NET, которая предоставляет вам мощные, хорошо продуманные классы.
Эффективность языка. Как ни странно, но программы, написанные на C#, выполняемые на .NET, являются очень эффективно выполняемыми приложениями. Однако, при разработке сложных программ следует учитывать не только скорость выполнения программы, но и скорость разработки программы, а также сложность дальнейшей модификации. По этому параметру язык C# значительно превосходит классический язык C++.
В последние годы наблюдается возникновение новой вычислительной
парадигмы - облачных вычислений (
Облачное приложение состоит из набора сервисов, работающих в
центре обработки данных. При этом все вопросы запуска сервисов и
поддержания их работоспособности берет на себя среда поддержки
вычислений - от программиста требуется реализовать соответствующий
программный код и файл с описанием и произвести развертывание. Как
правило, облачное приложение состоит из вычислительных компонентов
(это может быть веб-сервис, веб-приложение или вычислительный
блок, не требующий взаимодействия с пользователем) и хранилища
данных, которое мы отличаем здесь от термина "база данных" ,
поскольку из-за необходимости масштабирования как правило
применяются нереляционные хранилища. Вычислительные компоненты как
правило программируются в модели "без состояния" (
Следует отметить, что не любая задача может эффективно вычисляться
на облачном кластере в такой архитектуре. В отличие от
традиционного компьютерного кластера, в котором имеется
Ключевые термины
Научное программирование - стиль программирования, ориентированный на научные расчеты.
Облачные вычисления - вычисления, спроектированные таким образом, чтобы абстрагироваться от места проведения расчетов.
Краткие итоги: Рассмотрены черты научного программирования, даны рекомендации по повышению эффективности программ. Рассмотрены вопросы организации облачных вычислений.
Продемонстрировать на практике различные вычислительные процедуры. Научится самостоятельно реализовывать вычислительные процедуры для решения задач численного анализа.
Рассмотрим простую задачу вычисления факториала числа.$$n!=1\cdot2\cdot3\cdot\ldots\cdot(n-1)\cdot n.$$ Чтобы вычислить факториал мы должны спроектировать и реализовать вычислительную процедуру. Покажем этим примером, как можно реализовать вычислительные процедуры, основанные на разных принципах. Для задачи вычисления факториала мы будем использовать процедуры, основанные на итерациях, и процедуры, основанные на рекурсии.
Первая вычислительная процедура выглядит следующим образом:
$$\begin{verbatim} public int F1(int N) { int res = 1; for (int i = 1; i <= N; i++) { res = res * i; } return res; } \end{verbatim}$$Вторая процедура будет основана на рекурсивном вызове:
$$\begin{verbatim} public int F2(int N) { if (N == 1) { return 1; } else { return N * F2(N - 1); } } \end{verbatim}$$С математической точки зрения - обе эти процедуры эквивалентны, но с вычислительной точки зрения между этими реализациями есть существенные различия. Чтобы оценить быстродействие наших процедур выполним следующий тест:
$$\begin{verbatim} int i; int A = 0; for (i = 0; i < N; i++) { A += F1(100); } Console.WriteLine("F1: {0}", A); A = 0; for (i = 0; i < N; i++) { A += F2(100); } Console.WriteLine("F2: {0}", A); \end{verbatim}$$Заметим, что кроме быстродействия необходимо рассматривать также и такой параметр, как требуемая память. Для рекурсивных процедур с большим уровнем вложения может потребоваться большой объем стека.
В лекции, посвященной вычислительным процедурам, мы отмечали, что из-за наличия машинного $$\varepsilon$$ эквивалентные (с математической точки зрения) вычислительные процедуры могут давать различные результаты. В качестве примера - попробуем проверитЬ на компьютере выполнение различных тождеств:$$\sin^2x+\cos^2x=1,$$ $$\ln e=1,$$ $$\cos 2\pi=1.$$ Для этого выполним следующий тест
$$\begin{verbatim} double x = 3.0; if ((Math.Cos(x) * Math.Cos(x) + Math.Sin(x) * Math.Sin(x)) == 1.0) { Console.WriteLine("Yes!"); } else { Console.WriteLine("No"); } x = Math.E; if (Math.Log(x) == 1.0) { Console.WriteLine("Yes!"); } else { Console.WriteLine("No"); } x = 2.0 * Math.PI; if (Math.Cos(x) == 1.0) { Console.WriteLine("Yes!"); } else { Console.WriteLine("No"); } \end{verbatim}$$В качестве демонстрации свойства устойчивости и неустойчивости различных вычислительных процедур. Рассмотрим одну задачу, которая имеет известное решение. Задача - найти значение решения дифференциального уравнения$$y'(x)=ay(x),$$ $$y(0)=C$$ при $$x=T$$.
Известно, что решением задачи 1 - 2 будет число $$Ce^{aT}$$. Если мы будем решать эту задачу с помощью численного метода, например, метода Эйлера, то устойчивость нашей вычислительной процедуры будет зависеть от знака числа $$a$$. Если $$a>0$$, то наша вычислительная процедура является неустойчивой.
Продемонстрировать на практике различные вычислительные процедуры. Научится самостоятельно реализовывать вычислительные процедуры для решения задач численного анализа.
Для исследования устойчивости решений необходимо рассмотреть собственные значения матрицы$$A=\left(% \begin{array}{cc} a_{11} a_{12} \\ a_{21} a_{22} \\ \end{array}% \right).$$ Если собственные значения этой матрицы имеют отрицательные вещественные части, то решения задачи Коши будут устойчивыми.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.