Python решение нелинейных уравнений метод половинного деления

Как решить пару нелинейных уравнений с использованием Python?

Каков наилучший способ решения пары нелинейных уравнений с использованием Python. (Numpy, Scipy или Sympy)

Фрагмент кода, который решает вышеупомянутую пару, будет отличным

ОТВЕТЫ

Ответ 1

для численного решения, вы можете использовать fsolve:

Ответ 2

Если вы предпочитаете sympy, вы можете использовать nsolve.

Первый аргумент — это список уравнений, второй — список переменных, а третий — исходное предположение.

Ответ 3

Попробуйте это, я заверяю вас, что он будет работать отлично.

FYI. как упоминалось выше, вы также можете использовать «приближение Бройдена», заменив «fsolve» на «broyden1». Оно работает. Я сделал это.

Я точно не знаю, как работает приближение Бройдена, но это заняло 0,02 с.

И я рекомендую вам не использовать функции Sympy

Ответ 4

Ответ 5

Вы можете использовать пакет openopt и его метод NLP. Он имеет множество алгоритмов динамического программирования для решения нелинейных алгебраических уравнений, состоящих из:
goldenSection, scipy_fminbound, scipy_bfgs, scipy_cg, scipy_ncg, amsg2p, scipy_lbfgsb, scipy_tnc, bobyqa, ralg, ipopt, scipy_slsqp, scipy_cobyla, lincher, algencan,, которые вы можете выбрать.
Некоторые из последних алгоритмов могут решить проблему ограниченного нелинейного программирования. Итак, вы можете ввести свою систему уравнений в openopt.NLP() с такой функцией:

lambda x: x[0] + x[1]**2 — 4, np.exp(x[0]) + x[0]*x[1]

Ответ 6

Я получил метод Бройдена для работы с связанными нелинейными уравнениями (как правило, с участием многочленов и экспонент) в IDL, но я не пробовал его в Python:

Найти корень функции, используя первое приближение Я. Я. Брайденса.

Этот метод также известен как «хороший метод Бройденса».

Ответ 7

Альтернативой fsolve является root :

Если вы затем проверите

подтверждая правильность решения.

Ответ 8

Краткий ответ: используйте fsolve

Как упоминалось в других ответах, самое простое решение конкретной поставленной вами проблемы — использовать что-то вроде fsolve :

Аналитические решения?

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

Обратите внимание, что в этом примере SymPy находит все решения и не требует предварительной оценки.

Точность числовых решений

Однако большинство систем нелинейных уравнений не будет иметь подходящего аналитического решения, поэтому использование SymPy, как описано выше, прекрасно, когда оно работает, но не всегда применимо. Вот почему мы в конечном итоге ищем числовые решения, хотя и с числовыми решениями: 1) У нас нет гарантии, что мы нашли все решения или «правильное» решение, когда их много. 2) Мы должны предоставить первоначальное предположение, которое не всегда легко.

Приняв, что нам нужны числовые решения, что-то вроде fsolve , как правило, сделает все, что вам нужно. Для такого рода проблем SymPy, вероятно, будет намного медленнее, но он может предложить что-то еще, что более точно находит (числовые) решения:

LecturesVMSH / Python / 2013-04-19

Работа с файлами. Метод половинного деления

Файл как позиционируемый поток. Работа с указателем с помощью f.tell()и f.seek().

Информация о файле: os.stat() или f.seek(0,2); f.tell()

команды sort, fgrep и join

<0>перенаправление вывода (в файл > файл, на стандартный вывод ошибок >&2, на ввод другой команде |)

Домашнее задание

Написать программу-генератор »большого» заранее сортированного строкового файла (порядка миллиона строк) и программу, которая ищет в этом файле строку, начинающуюся с заданной, двумя способами:

  1. Простым перебором
  2. Половинным делением с поиском начала строки

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

    Условные обозначения

    — тема по Linux

    » height=»16″ src=»http://www.uneex.ru/moin_static197/modernized/img/attention.png» title=» » width=»16″ /> ­— тема повышенной сложности

    — теоретическое задание

    — тема для самостоятельного изучения

    LecturesVMSH/Python/2013-04-19 (последним исправлял пользователь FrBrGeorge 2013-04-26 08:54:34)

    Решение нелинейных уравнений в python

    У меня есть 4 нелинейных уравнения с тремя неизвестными X , Y и Z , для которых я хочу решить. Уравнения имеют вид:

    … где a , b и c – это константы, зависящие от каждого значения F в четырех уравнениях.

    Каков наилучший способ решить это?

    Есть два способа сделать это.

    • Используйте нелинейный решатель
    • Линеаризовать проблему и решить ее в смысле наименьших квадратов

    Настройка

    Итак, насколько я понимаю ваш вопрос, вы знаете F, a, b и c в 4 разных точках, и вы хотите инвертировать параметры модели X, Y и Z. У нас есть 3 неизвестных и 4 наблюдаемых данных точек, поэтому проблема переопределена. Поэтому мы будем решать в наименьшем квадрате смысл.

    В этом случае более распространено использование противоположной терминологии, поэтому позвольте перевернуть свое уравнение вокруг. Вместо:

    Где мы знаем F , X , Y и Z в 4 разных точках (например, F_0, F_1, . F_i ).

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

    Линейное решение

    Фактически можно линеаризовать это уравнение. Вы можете легко решить для a^2 , b^2 , a b cos(c) и a b sin(c) . Чтобы сделать это немного проще, давайте снова переделаем вещи:

    Теперь уравнение намного проще: F_i = d + e X_i + f Y_i + g Z_i . Легко сделать линейную инверсию наименьших квадратов для d , e , F и g . Тогда мы можем получить a , b и c из:

    Хорошо, напишите это в матричной форме. Мы собираемся перевести 4 наблюдения (код, который мы напишем, будет занимать любое количество наблюдений, но пусть он будет оставаться конкретным в данный момент):

    Или: F = G * m (я геофизик, поэтому мы используем g для “зеленых функций” и m для “параметров модели”. Обычно мы использовали d для “данных” вместо F .)

    В python это будет выглядеть так:

    Нелинейное решение

    Вы также можете решить эту проблему, используя scipy.optimize , как предположил @Joe. Наиболее доступной функцией в scipy.optimize является scipy.optimize.curve_fit , которая по умолчанию использует метод Levenberg-Marquardt.

    Levenberg-Marquardt – это алгоритм “восхождения на холм” (ну, в данном случае он идет вниз, но этот термин используется в любом случае). В некотором смысле вы делаете первоначальное предположение о параметрах модели (все по умолчанию в scipy.optimize ) и следуете по склону observed — predicted в вашем пространстве параметров вниз донизу.

    Предостережение: Выбор правильного метода нелинейной инверсии, первоначальная догадка и настройка параметров метода – это очень “темное искусство”. Вы только учитесь этому, делая это, и есть много ситуаций, когда вещи не будут работать должным образом. Levenberg-Marquardt – хороший общий метод, если пространство параметров довольно гладкое (это должно быть). Есть много других (включая генетические алгоритмы, нейронные сети и т.д. В дополнение к более распространенным методам, таким как имитированный отжиг), которые лучше в других ситуациях. Я не собираюсь вникать в эту часть здесь.

    Существует одна общая информация о том, что некоторые инструменты оптимизации пытаются исправить, что scipy.optimize не пытается обрабатывать. Если ваши параметры модели имеют разные величины (например, a=1, b=1000, c=1e-8 ), вам нужно будет перемасштабировать вещи так, чтобы они были одинаковыми по величине. Иначе scipy.optimize “алгоритмы подъема холма” (например, LM) не будут точно рассчитать оценку локального градиента и дадут дико неточные результаты. На данный момент я предполагаю, что a , b и c имеют относительно близкие значения. Кроме того, имейте в виду, что по существу все нелинейные методы требуют от вас первоначального предположения и чувствительны к этой догадки. Я оставляю его ниже (просто передайте его как p0 kwarg на curve_fit ), потому что по умолчанию a, b, c = 1, 1, 1 является довольно точным предположением для a, b, c = 3, 2, 1 .

    С учетом предостережений curve_fit ожидает, что будет передана функция, набор точек, в которых были сделаны наблюдения (как один массив ndim x npoints ), и наблюдаемые значения.

    Итак, если мы напишем такую ​​функцию:

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

    Автономный Пример двух методов:

    Чтобы дать вам полную реализацию, вот пример, который

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


    источники:

    http://www.uneex.ru/LecturesVMSH/Python/2013-04-19

    http://techarks.ru/qa/python/reshenie-nelinejnih-uravnenij-RN/