Каждая функция, как кусок дерева, имеет свое «зерно», которое может создавать проблемы при работе с ним. Один из моих любимых методов - переставить выражение, чтобы избавиться от переменной в знаменателе. В вашем случае решение как sin(x)-3*x*cos(x)
имеет гораздо лучшее поведение:
>>> [nsolve(sin(x)-3*x*cos(x),i).n(2) for i in range(10)]
[0, 1.3, 1.3, -1.3, 4.6, 4.6, 1.3, 7.8, 7.8, 7.8]
Продолжение также является полезным методом для плохо управляемых функций. В этом случае может быть полезно использовать параметр для медленного включения плохо функционирующей части функции. В вашем случае x
в 3*x*cos(x)
усложняет ситуацию. Но если вы поделите на приблизительное значение, которое вы ищете, и медленно измените этот делитель на 1, вы можете следовать приблизительному корню до желаемого корня. Вот пример:
>>> a = 0.
>>> for j in range(5):
... for i in range(10):
... a = nsolve(sin(x)-3*x*cos(x)/(a + i*(1-a)/9),a)
... print(a)
... a += pi.n()+0.1
...
0
4.64068363077555
7.81133447513087
10.9651844009289
14.1135533715145