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

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

  • автор:

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

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

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

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

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

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

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

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

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

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

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

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

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

советы

Хочу предложить небольшой обзор свободного программного обеспечения для численных расчётов. Прежде всего для решения систем уравнений в частных производных (УрЧП). Решать их нужно во многих инженерных и начных областях (в гидродинамике, теории упругости, теплопроводности, электромагнетизме и других). К счастью, в этой области написано много качественных свободных программ. И учитывая, что 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

      Библиотеки для численных расчетов (метод конечных элементов)

      Подскажите, какие можно использовать библиотеки (Си, С++) для расчетов методом конечных элементов (FEM Analysis)? Желательно с триангуляцией. Довольно-таки важна скорость расчетов и возможность трехмерных расчетов.

      Отслеживать
      51.4k 87 87 золотых знаков 267 267 серебряных знаков 505 505 бронзовых знаков
      задан 24 мар 2011 в 7:39
      Алексей Котов Алексей Котов
      1,217 1 1 золотой знак 20 20 серебряных знаков 37 37 бронзовых знаков
      24 мар 2011 в 10:16
      А что посоветуете? Кто-нибудь пользовался?
      24 мар 2011 в 10:49

      1 ответ 1

      Сортировка: Сброс на вариант по умолчанию

      Поспрашивал коллегу: из того, что есть в википедии, пользовался тремя пакетами:

      По его отзывам лучший — GetFEM++. В добавку — небольшой обзор свободных программ для численных расчётов.

      Отслеживать
      ответ дан 24 мар 2011 в 12:07
      Nicolas Chabanovsky Nicolas Chabanovsky
      51.4k 87 87 золотых знаков 267 267 серебряных знаков 505 505 бронзовых знаков

      • c
      • c++
        Важное на Мете
      Похожие

      Подписаться на ленту

      Лента вопроса

      Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

      Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.9.3159

      Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

      Есть ли смысл использовать для численных расчетов python?

      Есть ли смысл использовать для численных расчетов python (методы конечных элементов, математические расчеты, много циклов, большие данные)?

      Или лучше использовать c++? Насколько медленнее код получается?

      • простой
      • можно быстро создать алгоритм или переделать
      • много библиотек для численных расчетов, построения графиков
      • низкий порог вхождения, другим будет проще его изучить
      • можно потом куски на си переписать
      • медленнее плюсов
      • после c++ трудно переключится, кое-что по-другому (структуры, switch)
      • я его гораздо хуже знаю

      Дал прогу на c++ одному, от так и не смог его осилить 🙁

      Поделитесь историей успеха.

      Zodd ★★★★★
      19.02.17 23:50:51 MSK
      1 2 3 4 5 6 →

      Бери петон, профилируй, критичные куски переписывай на цэ.

      Akamanah ★★★★★
      ( 19.02.17 23:58:52 MSK )

      Используй Pure C. Нафига тебе для расчетов плюсы сдались?

      У меня сейчас такой период, что быстрее накатать любое поделие на сях, чем изучать что то более подходящее. Вообще смотри по себе. Главное не зацикливаться.

      Cactus64k ★
      ( 20.02.17 00:31:18 MSK )
      Последнее исправление: Cactus64k 20.02.17 00:32:30 MSK (всего исправлений: 1)

      Пиши на Python, запускай на PyPy.

      BigAlex ★★★
      ( 20.02.17 00:31:54 MSK )

      Если есть готовый модуль для py который всё нужное посчитает, то можно взять питон. В противном случае будет очень медленно и крайне неудобно кодить, так что лучще брать с++.

      Дал прогу на c++ одному, от так и не смог его осилить

      если, конечно, умеешь кодить на плюсах.

      mashina ★★★★★
      ( 20.02.17 00:40:08 MSK )
      Ответ на: комментарий от Cactus64k 20.02.17 00:31:18 MSK

      У меня сейчас такой период, что быстрее накатать любое поделие на сях

      RazrFalcon ★★★★★
      ( 20.02.17 00:42:16 MSK )

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

      anonymous
      ( 20.02.17 00:45:16 MSK )
      Ответ на: комментарий от Cactus64k 20.02.17 00:31:18 MSK

      C в любом случае выгодней.

      Всякие жабко-пхытоны нужны лишь быдлокодерам, у которых зарплата не от качества, а от количества зависит. Набыдлокодил 100 полудохлых скриптов на пхытоне — получи конфетку.

      anonymous
      ( 20.02.17 00:46:57 MSK )

      Если стоит выбор между C++ и Python — тогда золотой срединой будет Rust.

      RazrFalcon ★★★★★
      ( 20.02.17 00:53:00 MSK )
      Ответ на: комментарий от BigAlex 20.02.17 00:31:54 MSK

      Можно питон с numba, оно даже умеет параллельные вычистления cuda

      ism ★★★
      ( 20.02.17 00:55:22 MSK )
      Ответ на: комментарий от RazrFalcon 20.02.17 00:53:00 MSK

      При всём моём уважении к Rust’у — Go всё-таки гораздо ближе к Python’у.

      Singularity ★★★★★
      ( 20.02.17 00:56:01 MSK )

      Питон для этого не подойдёт. Там где много циклов, фортран нужно использовать. Обёртку можно на питоне.

      yvv ★★☆
      ( 20.02.17 01:00:14 MSK )
      Ответ на: комментарий от Singularity 20.02.17 00:56:01 MSK
      RazrFalcon ★★★★★
      ( 20.02.17 01:00:22 MSK )
      Ответ на: комментарий от Singularity 20.02.17 00:56:01 MSK

      Go — это ж вообще финиш! Это даже не пхытон. Это просто ДНО!

      anonymous
      ( 20.02.17 01:01:14 MSK )

      Странно что еще никто R не посоветовал.

      CrossFire ★★★★★
      ( 20.02.17 01:05:14 MSK )

      zolden ★★★★★
      ( 20.02.17 01:08:57 MSK )

      Тебе скорость там сильно вперлась? Если да, то C бери. А вообще посмотри на библиотеку numpy.

      Обрати внимание на вот эту прелесть http://jupyter.org . Я последнее время на нем все алкоритмы накидываю.

      deterok ★★★★★
      ( 20.02.17 01:09:27 MSK )

      Тебе скорости не хватает?

      после c++ трудно переключится, кое-что по-другому (структуры, switch)

      Ты только C++ знаешь, что ли?

      На скриптушных языках можно начинать говнокодить после получасового просмотра документации.

      Esper ★
      ( 20.02.17 01:09:52 MSK )
      Ответ на: комментарий от RazrFalcon 20.02.17 00:42:16 MSK

      Скорей лень нормально изучать другой язык. И сишку я знаю лучше других языков.

      Cactus64k ★
      ( 20.02.17 01:20:42 MSK )

      Интересуют одноразовые расчеты вроде Mathcad? Или нужно реализовать какой-то алгоритм и, условно, использовать его в продакшене?

      Для первого случая, когда нужно «набросать на коленке» некий прототип, понять будет ли вообще алгоритм работать или сделать красивый отчет с графиками и листингами сам использую python + jupyter notebook + scipy/pandas/numpy/nltk/scikit-learn. Вообще суперская связка, особенно если внутри IDE с родными хоткеями. Лучше черновика не придумать.

      Nicholass ★★★
      ( 20.02.17 02:48:22 MSK )

      А смотря для каких расчётов. Может быть, можно взять NumPy, Theano или Tensorflow?

      proud_anon ★★★★★
      ( 20.02.17 03:12:27 MSK )

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

      Zeta_Gundam ★
      ( 20.02.17 03:46:26 MSK )

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

      при грамотном использовании (см. выше) это не так.

      после c++ трудно переключится, кое-что по-другому (структуры, switch)

      я его гораздо хуже знаю

      научишься. c++ немного портит моск, но не необратимо.

      dikiy ★★☆☆☆
      ( 20.02.17 03:57:08 MSK )

      Петон в своих самых «тугих» местах минимум раз в сто медленнее чем С. Петон со всякими ухишрениями в виде кусков математики на С все равно медленнее чем просто С раз в пять.

      Так что если тебе посчитать на один раз и время расчёта вообще не критично. А лучше С!

      init_6 ★★★★★
      ( 20.02.17 07:57:00 MSK )
      Ответ на: комментарий от dikiy 20.02.17 03:57:08 MSK

      c++ немного портит моск, но не необратимо.

      А вот пхытон портит необратимо. Человек становится умственным инвалидом.

      anonymous
      ( 20.02.17 08:37:13 MSK )

      Обычно, есть два этапа написания кода расчётов:

      • Разработка алгоритма;
      • Реализация быстрой версии

      Первую часть делать на плюсах будет очень долго. Для этого используют Matlab, Mathematica, R, Python.

      Для второго куска (если он вообще оказывается необходим) используют либо биндинги к быстрым либам из перечисленного выше, либо переписывают на крестах с использованием OpenMP\CUDA.

      Norgat ★★★★★
      ( 20.02.17 08:51:24 MSK )

      А фортран уже не в моде стал?

      dave ★★★★★
      ( 20.02.17 10:07:34 MSK )

      а чем вы там занимаетесь? вот мне интересно я бы осилил или нет? )

      wackobird
      ( 20.02.17 10:15:58 MSK )

      Посмотри Theano, может подойдёт. Библиотечка генерит код на плюсах/куде для определённых, с помощью неё, функций.

      Leron ★★
      ( 20.02.17 10:31:44 MSK )

      Python с его numpy вообще не плохо подходить для всяких математических штук. В однопотоке вообще он плох, собственно затем там GIL и нужен, а вот многопоточность его слабое место. Ну и да, возможность переписывать куски на Cи вообще годнота

      Dred ★★★★★
      ( 20.02.17 10:36:30 MSK )

      Python активно используется как обёртка, пример, https://fenicsproject.org/

      Его numpy/scipy ядро для многих численных пакетов

      Общий смысл: основные расчёты внутри Си/. библиотек, а используются эти библиотеки из Python, где лаконичнее выглядит код, плюс достаточно средств для черновой визуализации.

      Есть такая штука ipython/jupyter notebook (пример: http://nbviewer.jupyter.org/github/ipython/ipython/blob/4.0.x/examples/IPytho. ) с которой очень удобно проводить черновые расчёты.

      AlexVR ★★★★★
      ( 20.02.17 11:08:07 MSK )

      а с чего это код на питоне будет медленнее сишного, если ты numpy юзать будешь? Сам так делаю, брат жив.

      demidrol ★★★★★
      ( 20.02.17 11:21:27 MSK )

      Если не надо гонять программу сотни раз на кластере, и расчеты укладываются в NumPy — да, можно.

      tailgunner ★★★★★
      ( 20.02.17 11:25:16 MSK )
      Ответ на: комментарий от init_6 20.02.17 07:57:00 MSK

      Петон со всякими ухишрениями в виде кусков математики на С все равно медленнее чем просто С раз в пять.

      dikiy ★★☆☆☆
      ( 20.02.17 11:38:31 MSK )
      Ответ на: комментарий от dikiy 20.02.17 11:38:31 MSK

      Возвращайся как померяешь поверенным средством измерения.

      init_6 ★★★★★
      ( 20.02.17 11:40:04 MSK )

      Отвечу сразу всем в одном посте:

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

      Первую часть делать на плюсах будет очень долго. Для этого используют Matlab, Mathematica, R, Python.

      Вот поэтому я и задумался о питоне. А так много работал с Mathematica, но как язык он мне не нравится.

      Странно что еще никто R не посоветовал.

      R как мне кажется немного для других вещей.

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

      В силу особенности задачи много вложенных циклов, т.к. необходимо пробежатся по тысячам объектов, у которого есть несколько точек, в каждой из них надо что-то просуммировать. И все это для 3-х мерной области и на каждом шаге))

      Там где много циклов, фортран нужно использовать. Обёртку можно на питоне.

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

      Используй Pure C. Нафига тебе для расчетов плюсы сдались?

      Почему не чистый си — т.к. не хватает большей абстракции, и вещи типа vector и итераторы итп.

      На плюсах впринципе хватает, т.к. я использую lapack. В основном в задаче у меня все упирается в решение СЛАУ — очень большие матрицы.

      Если не надо гонять программу сотни раз на кластере, и расчеты укладываются в NumPy — да, можно.

      Я тут недавно услышал, что одна фирма для научных расчетов написала код на си + питон как обертка. Причем они расчитывают на кластерах с очень большим количеством данных. Вот я поэтому и призадумался.

      Zodd ★★★★★
      ( 20.02.17 12:21:50 MSK ) автор топика
      Ответ на: комментарий от Zodd 20.02.17 12:21:50 MSK

      Еще в numpy нет проблемы с матрицами как в библиотеке lapack, в lapack матрицы располагаются по столбцам как в фортране.

      Еще можно легко подрубить cuda, разреженные матрицы, mpi

      Zodd ★★★★★
      ( 20.02.17 12:31:03 MSK ) автор топика
      Ответ на: комментарий от init_6 20.02.17 11:40:04 MSK

      Возвращайся как померяешь поверенным средством измерения.

      Проверено на реальной задаче (численное решение модели плотности распределения растительности).

      А пока что голословен лишь ты.

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

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