Функция Sympy nsolve и несколько решений

Я сделал эту небольшую тестовую программу на питоне, чтобы увидеть, как работают solve и nsolve.

from sympy import *

theta = Symbol('theta')
phi = Symbol('phi')

def F(theta,phi):
    return sin(theta)*cos(phi)+cos(phi)**2
def G(phi):
    return ((1 + sqrt(3))*sin(phi) - 4*pi*sin(2*phi)*cos(2*phi))
solution1 = solve(F(pi/2,phi),phi)
solution2 = solve(G(phi),phi)
solution3 = nsolve(G(phi),0)
solution4 = nsolve(G(phi),1)
solution5 = nsolve(G(phi),2)
solution6 = nsolve(G(phi),3)
print solution1, solution2, solution3, solution4, solution5, solution6

И я получаю этот вывод:

[pi/2, pi] [] 0.0 -0.713274788952698 2.27148961717279 3.14159265358979

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


person aymenbh    schedule 12.11.2012    source источник


Ответы (1)


Первый вызов решения дал мне два решения соответствующей функции. Но не второй. Интересно, почему?

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

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

Есть ли способ получить список всех числовых решений с помощью nsolve или другой функции всего в одной строке?

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

person Ali    schedule 12.11.2012
comment
Спасибо! Я помещаю nsolve в цикл for, чтобы отслеживать решения, найденные с разными начальными предположениями, равномерно распределенными в [0,pi]. - person aymenbh; 12.11.2012
comment
@ user1816760 Да, это может сработать. Многозаходный метод часто является правильным методом для применения. Имейте в виду, что очень вероятно, что одно и то же решение будет найдено несколько раз, И решения будут приблизительными. Например, допустим, что точное решение равно 0,5, тогда вы найдете 0,4999997 и 0,5000002 и так далее. Несмотря на то, что они различаются, следует хранить только один из них. Надеюсь, вы понимаете, что я имею в виду. - person Ali; 12.11.2012
comment
Да я вижу. Я пробовал с другими функциями, и иногда я получаю одно и то же решение несколько раз или некоторые значения, которые близки друг к другу, как вы упомянули. Я учту это при хранении данных. - person aymenbh; 12.11.2012
comment
И даже если аналитические решения существуют, нет причин полагать, что алгоритмы решателя SymPy найдут их. Они не безошибочны. - person asmeurer; 13.11.2012