Сципи: рассчитать x-перехват нелинейной функции - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь использовать scipy.optimize.fsolve, чтобы определить x-перехват (ы):

from scipy.optimize import fsolve
from numpy import array, empty

counter = 0


def f(x_):
    global counter
    counter += 1
    return pow(x_, 3) * 3 - 9.5 * pow(x_, 2) + 10 * x_


x0_ = empty(2)
x0_[0] = 1
x0_[1] = 6
res = fsolve(f, x0=x0_)
print(counter)
print(res)

функция f (x): https://www.desmos.com/calculator/8j8djr01da результат этот код:

74
[0. 0.]

Я ожидаю, что результат будет

[0, 1.575, 3.175]

Может кто-нибудь предложить какую-нибудь помощь.

Плюс: я не могу понять документацию из fsolve (x0), это только предположение? Буду очень признателен, если вы сможете объяснить.

Плюс Плюс: я буду работать с множеством линейных уравнений с неизвестными и экспоненциальными выражениями, я действительно ищу способ проработки x-перехватов, другими словами, корней с помощью выражения f (х). Я был бы так рад, если вы можете помочь.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Вы получаете набор всех корней для полинома по

numpy.roots([3, -9.5, +10, 0])
array([1.58333333+0.90905934j, 1.58333333-0.90905934j,
   0.        +0.j        ])

Не ясно, каковы ваши другие ожидаемые реальные корни, fsolve найдет только реальное root 0.

Конечно, если вы возьмете коэффициенты, которые вы использовали в графическом инструменте Desmos

numpy.roots([2, -9.5, +10, 0])

, вы действительно получите ожидаемое

array([3.17539053, 1.57460947, 0.        ])

Для скалярных неполиномиальных функций интерфейс scipy.optimize.find_root, возможно, более подходит, особенно если вы можете указать интервал брекетинга.

1 голос
/ 02 апреля 2020

Я просто хочу сказать, что на первом шаге вы неправильно определяете свою функцию: она должна быть

def f(x_):
  #  global counter
  #  counter += 1
    return pow(x_, 3) * 2 - 9.5 * pow(x_, 2) + 10 * x_

, но не pow(x_, 3) * 3 - 9.5 * pow(x_, 2) + 10 * x_

Если вы затем точно установите x0_ :

x0_=[0,1,3] # according to intersection on graph
res=fsolve(f, x0=x0_)

Дайте ожидаемый результат:

[0.         1.57460947 3.17539053]

Иногда вам просто нужно быть более осторожным:)

...