Производные в C/C++?

21
задан gsamaras 18 October 2014 в 02:47
поделиться

6 ответов

Разбирание в числовом дифференцировании (в смысле уменьшения ошибок) может быть довольно хитрым. Для начала работы можно хотеть смотреть на раздел Числового Recipies по числовые производные .

Для бесплатных символьных математических пакетов, необходимо посмотреть GiNaC. Вы могли также проверить SymPy, автономное, чистый Python символьный математический пакет. Вы найдете, что SymPy намного легче исследовать, так как можно использовать его в интерактивном режиме из командной строки Python.

На коммерческом конце, и Mathematica и Maple имеют API C. Вам нужна установленная/лицензионная версия из программы для пользований библиотеками, но оба могут легко сделать тип символьного дифференцирования, которое Вы после.

6
ответ дан 29 November 2019 в 21:17
поделиться

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

, Если Вы решаете к самокрутке, у меня есть несколько предложений, которые упростят Вашу жизнь:

  • Использование неизменные структуры данных (чисто функциональные структуры данных) для представления выражений.

  • Использование сборщик "мусора" Hans Boehm для управления памятью для Вас.

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

, Если Вы готовы встроить , Lua в Ваш C кодирует и делает Ваши вычисления там, я поместил свой код Lua в http://www.cs.tufts.edu/~nr/drop/lua . Одна из более хороших функций - то, что это может взять символьное выражение, дифференцировать его и скомпилировать результаты в Lua. Вы, конечно, не найдете документации безотносительно:-(

12
ответ дан 29 November 2019 в 21:17
поделиться

Если бы это действительно - вид функции, Вы хотите использовать, было бы достаточно легко записать библиотеку классов. Запустите с единственного Термина с коэффициента и экспоненты. Имейте Многочлен, который состоял бы из Набора Условий.

при определении интерфейса для математических методов интереса (например, add/sub/mul/div/differentiate/integrate), Вы смотрите на шаблон Составного объекта GoF. Оба Термина и Многочлен реализовали бы тот интерфейс. Многочлен просто выполнил бы итерации по каждому Термину в его Наборе.

1
ответ дан 29 November 2019 в 21:17
поделиться

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

В основном, Повышение. Первичный позволяет Вам преобразовывать любое допустимое выражение C++, такой как x * x + y * y к шаблон выражения - в основном, представление дерева синтаксического анализа того использования выражения вложило struct с - и затем выполните любое произвольное вычисление по тому дереву синтаксического анализа в более позднее время путем вызова proto::eval() на нем. По умолчанию, proto::eval() используется для оценки дерева, как будто оно было выполнено непосредственно, хотя нет никакой причины, почему Вы не могли изменить поведение каждой функции или оператора для взятия символьной производной вместо этого.

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

1
ответ дан 29 November 2019 в 21:17
поделиться

Это отчасти в стороне, так как это относится к Lisp и не C/C++, но это могло помочь другим, ищущим подобные задачи, или Вы могли бы получить некоторое представление относительно реализации чего-то подобного в C/C++ самостоятельно. SICP имеет некоторые лекции по предмету для шепелявости:

  1. производные правила 3b
  2. алгебраические правила 4a

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

0
ответ дан 29 November 2019 в 21:17
поделиться

Если вы выполняете численное дифференцирование («оцените производную от f (x) в x = x0 ») ) и вы заранее знаете, что вы используете уравнения (т.е. не вводите данные пользователем), то я бы рекомендовал FADBAD ++ . Это библиотека шаблонов C ++ для решения числовых производных с использованием Автоматического дифференцирования . Это очень быстро и точно.

6
ответ дан 29 November 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: