Решить нелинейное уравнение в Python/SageMath

Я новый пользователь Python и SageMath.

У меня есть два нелинейных уравнения:

  1. f(x)==h(x)
  2. g(x)+S_{i,j,k}(x) == 0

Я знаю, что могу решить 1. численно, выполнив:

x = var('x')
find_root(f(x)==h(x), x, x_min, x_max)

В 2. S_{i,j,k}(x) является функцией тройной суммы x, а i, j и k являются индексами суммы. Как решить численно?


person Josè Luis Mietta    schedule 08.04.2015    source источник


Ответы (1)


Используя Python и sympy, вы можете определить свою S_{i,j,k}(x) функцию, используя sympy.mpmath.nsum(), а затем используйте sympy.mpmath.findroot():

import sympy.mpmath

x = sympy.symbols('x')


def S(x_):
    return sympy.mpmath.nsum(lambda i, j: x_*i + j, [0, 2], [3, 4])


print('Function: {}'.format(S(x)))
print('Solution: {}'.format(sympy.mpmath.findroot(S, -1)))

печатает:

Function: 6.0*x + 21.0
Solution: -3.5

Я выбрал линейный пример, но он работает и с нелинейными уравнениями.

person user    schedule 08.04.2015
comment
Спасибо! Когда я импортирую sympy.mpmath x = sympy.symbols('x') A=2 def S(x): return sympy.mpmath.nsum(lambda i, j,k: (12*A^4*x^6 *i^4-30*A^2*x^3*i^2*(j^2+k^2)+3*(j^2+k^2^2)/(2*(A^2 *x^3*i^2+j^2+k^2) ^ (7/2)), [1, 500], [1, 500], [1,500]) S(1), система разбивается. (^ означает потенцию **). Это для высоких пределов суммирования (500)? В таком случае, как я могу установить предел допуска? С наилучшими пожеланиями!! - person Josè Luis Mietta; 09.04.2015
comment
@JosèLuisMietta Вам не хватает скобки. Тем не менее, даже с правильным синтаксисом я получаю MemoryError просто за попытку вызвать S(1) (думаю, попытка решить это была бы намного хуже). [1,500] означает, что i изменяется от 1 до 500; используя 1-50, я получаю S(1) равным 9409331700000.48. Я не знаю, подойдет ли мой ответ для вашей проблемы. - person user; 09.04.2015
comment
Большое спасибо! Используя 20 для предела суммирования (при этом я избегаю проблемы с памятью при сбое). Если я попытаюсь решить уравнение S (x) = x + 2, выполнив sympy.mpmath.findroot (S (x) -x -2, 0), я получаю сообщение об ошибке TypeError: неподдерживаемый родительский операнд для '*': 'Symbolic Ring' и '‹class 'sympy.mpmath.ctx_mp_python.mpf'›', что я делаю неправильно? С наилучшими пожеланиями - person Josè Luis Mietta; 10.04.2015