Как написать программу для численных расчетов
Перейти к содержимому

Как написать программу для численных расчетов

  • автор:

Приложение «Численные методы на C#»

Этот пост в равной степени мог бы присутствовать в блогах «Я пиарюсь», «Open Source» или «.NET». Но так как программа, о которой я хочу рассказать, очень тесно связана с образованием, то я решил опубликовать его именно сюда.

Если кратко, то речь пойдет об open source проекте под названием «Numerical Methods on C#» — наборе реализаций численных методов на языке C#, в то же время позволяющая проводить расчеты с помощью написанного на WPF графического интерфейса.

Кому интересно — читаем ниже.

Программа представляет собой набор реализаций численных методов — от методов интерполяции до решения дифференциальных уравнений + графический интерфейс, написанный на WPF. Также на странице проекта можно скачать версию, написанную на Windows Forms.

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

Почему образование?

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

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

Принять участие

Хочу сразу оговориться, что программу разрабатывали, в основном, студенты «за опыт», я принимаю участие в проекте потому, что мне это нравится. Программа содержит ряд неточностей, ошибок, недоработок, посему предлагаю активной части хабрасообщества присоединится к проекту и выявить (устранить) их. Кроме того, если у вас есть реализованные алгоритмы, методы (как известные, так и свои) — присылайте, мы их включим в программу.

Ошибки можно постить в issue tracker, либо в комментариях, либо в личку. За одно и проверим активность хабрасообщества 🙂

Официальная страница проекта: numerical.codeplex.com

Написать программу численного расчета электростатического поля в осесимметричной системе

Author24 — интернет-сервис помощи студентам

2. Методом последовательной верхней релаксации с различными значениями параметра найти зависимость скорости сходимости методов (т.е. число итераций, необходимое для достижения заданной точности при заданном h) от типа метода и параметра .
Критерий окончания итерационного процесса: , норма эвклидова.
3. Визуализировать полученные результаты расчетов – построить поле u(x,y) (посредством построения эквипотенциалей u(x,y) = const и поверхности z = u(x,y)); построить график число итераций = f().

Пояснение
1. Проходим по внутренним узлам области, но используем формулу с параметром релаксации . Проход снизу вверх, справа влево, запись в тот же массив,
но при этом – перемешивание старого значения, взятого с коэфф-том и нового, взятого с коэфф-том (формула (20) на стр 385)
2. Появляется доп задача учета непрямоугольной границы. Можно выбрать массив-сетку так, чтобы область «вкладывалась» в массив, затем, сканируя, напр., по строкам массива, определить положения граничных элементов внутри каждой строки. Граничные эл-ты узлы выбираются как ближайшие к границе (Рис. 1).

Рис. 1. Внутренние узлы – зеленые, серые и красный, граничные узлы – синие; порядок обхода показан зелеными стрелками

ВАРИАНТ 8(рисунок на листке под номером 8)

советы

Хочу предложить небольшой обзор свободного программного обеспечения для численных расчётов. Прежде всего для решения систем уравнений в частных производных (УрЧП). Решать их нужно во многих инженерных и начных областях (в гидродинамике, теории упругости, теплопроводности, электромагнетизме и других). К счастью, в этой области написано много качественных свободных программ. И учитывая, что GNU/Linux — сегодня главная платформа для численных расчётов, это неудивительно. К сожалению, не все, кому приходится впервые сталкиваться с численными расчётами знают об этих программах. Чаще всего на слуху пара названий коммерческих продуктов с закрытым исходным кодом, ограниченными возможностями расширения и астрономической ценой. Этим мини-обзором я хочу исправить такую ситуацию и рассказать о свободных программах. Я надеюсь, этот обзор будет полезен тем, кто начинает заниматься численными расчётами и ищет подходящее программное обеспечение.

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

Основы
Линейная алгебра
  • BLAS, есть несколько программных реализаций, свободные: BLAS c netlib, автоматически оптимизированный ATLAS; несвободные: MKL (Intel), GotoBLAS и другие
  • LAPACK
  • PLAPACK
  • ScaLAPACK
  • Elemental (основан на FLAME)
Решение систем линейных уравнений
  • Прямые методы
    • UMFPACK
    • SuperLU
    • TAUCS (библиотека включает и итерационные алгоритмы)
    • Многие методы могут быть легко реализованы самостоятельно, см. книжку Templates for the solution of linear systems: building blocks for iterative methods
    • PETSc (возможность распараллеливания по MPI)
    • LASPACK (включает многосеточные методы, но годится только для последовательных машин)
    • TAUCS (библиотека включает и прямые алгоритмы)
    • Aztec (библиотека для параллельного итерационного решения линейных систем, эффективная, с доступным исходным кодом, но несвободной лицензией)
    Работа с (разреженными) матрицами
    • Fortran
      • UMFPACK
      • SuperLU
      • PETSc
      • SPARSKIT2
      • UMFPACK
      • SuperLU
      • PETSc
      • TAUCS
      • TNT (просто и сердито, один inlcude-файл)
      • FLENS (включает также эффективный, удобный и элегантный интерфейс к BLAS и LAPACK)
      • uBLAS (интерфейс к BLAS из коллекции библиотек Boost)
      • GMM++ (предоставляет единый интерфейс к разным решателям, успешно используется в GetFEM++)
      • Blitz++ (вообще говоря, не поддерживает разреженные матрицы, но это очень эффективная библиотека, если нужны плотные многомерные матричные структуры, но без линейной алгебры)
      • Seldon (не пробовал)
      • SparseLib++ (не пробовал)
      • + всё то же самое, что и в C
      • PySparse (есть в Debian)
      • petsc2py (интерфейкс к PETSc из Python)
      Прикладные программные пакеты и библиотеки

      Переходим к решению собственно систем уравнений в частных производных. Три наиболее используемых математических метода: метод конечных элементов, метод конечных объёмов и метод конечных разностей.

      Именно так я и сгруппирую программные пакеты: по типу реализованного математического метода. После имени пакета указаны его основные особенности, такие как размерность задачи на которую он рассчитан или язык программирования с которым он может применяться.

      • Python с PySparse
      • C++ с GMM++ или каким-нибудь другим из решателей линейных систем (см. выше)
      • C или Fortran с любым подходящим решателем линейных систем
      • Overture (см. выше)
      Универсальные среды для расчётов и прототипирования (замена Matlab)
      • FreeFEM++/FreeFEM3D
      • GetDP
      • Gerris
      • Elmer
      • Impact

      Инструменты для научных вычислений?

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

      Кто-нибудь может просветить — что обычно используют при создании таковых? Меня интересует, какими обычно пользуются языками (c++ / python / scala и т.д.), библиотеками (petsc / blitz++ / numpy / scipy и т.д.), как строят сетку и сохраняют результаты расчетов?

      • Вопрос задан более трёх лет назад
      • 4992 просмотра

      2 комментария

      Оценить 2 комментария

      А в сторону Haskell смотрели? Он очень хорош, если речь идет о сложных вычислениях.
      erthalion @erthalion Автор вопроса

      Да, смотрел — и даже пробовал) Но так и не смог догадаться, как можно реализовать некоторые нужные мне функции. Например, что-нибудь вроде вычисления дискретного лапласиана?

      image

      В поле моего зрения также попадал вот этот проект, но тоже не получилось полностью адаптировать под свои задачи (видимо, я еще плохо знаю Haskell)

      Решения вопроса 0
      Ответы на вопрос 8
      Научные вычисления? Почему бы не MATLAB?
      Ответ написан более трёх лет назад
      Комментировать
      Нравится 4 Комментировать
      matlab | octave
      Ответ написан более трёх лет назад
      Комментировать
      Нравится 1 Комментировать
      R. На хабре есть вводные статьи.
      Ответ написан более трёх лет назад
      Комментировать
      Нравится 1 Комментировать
      Для символьных можно Mathematica, Maple.
      Ответ написан более трёх лет назад
      Комментировать
      Нравится 1 Комментировать
      kbtsiberkin @kbtsiberkin

      OpenFOAM показывает себя надёжной программой, и позволяет порой не задумываться о тонкостях алгоритма, т.к. от пользователя требуется практически только задание уравнений.

      А если честно, всю сознательную научную жизнь пишу на Fortran, последнее время активно используя gfortran и современные интеловские компиляторы. Значительная часть нашей кафедры и научных сотрудников смежного профиля также использует Fortran для численного моделирования. Язык эффективный, ни капельки не мёртвый. Кроме того, для него легко найти и хорошие, давно используемые и потому хорошо отлаженные библиотеки — MKL, IMSL, LAPACK и другие. Список можно глянуть в англ.вики.

      Собственно, Fortran для гидродинамики (да и вообще для научных вычислений) действительно остаётся актуальным и качественным языком, где практически невозможно «выстрелить себе в ногу».

      Для символьных вычислений достаточно хорош Maple (в режиме Classic Worksheet, практически не загружающем интерактивного интерфейса), из бесплатных программ почти равнозначна ему Maxima. Wolfram Mathematica довольно тяжеловесна и несколько специфична в работе, зато имеет эффективные встроенные средства распараллеливания на многоядерные процессоры и очень хорошие средства визуализации, а также реализации интерактивности на графиках и при расчётах.

      MATHLAB и Octave работают только на численные вычисления, но тоже сравнительно эффективны. Хотя, написание программы для них порой ничем не отличается от написания программы на каком-либо языке программирования, и в этом смысле они неэффективны. Чистые языки более гибки в своих средствах.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *