Как вычислить минимальное значение многочлена в определенном диапазоне, используя Python? - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть многочлен (например, x ^ 3 - 3x ^ 2 + 4), и я хочу вычислить его минимальное значение в диапазоне (например, между [-1,1]), используя Python.Я думал, что было бы легко использовать NumPy и / или аналогичные библиотеки, однако я не смог найти решение с помощью Google.

Можно ли вычислить минимальное значение для полиномиальной дроби (например, (x ^2 -1) / (x + 3)) в определенном диапазоне с использованием Python?

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

Рекомендую упорядочить функцию от numpy.

import numpy as np

def function(x):
    return x**3 - 3*x**2 + 4

def search_min(set, end, freq):
    section = np.arange(set, end, freq)
    arr = []
    for i in section:
        arr.append(function(i))

    ## This is check mid-process
    ## If this is verified you can delete this sentence
    for j in arr:
        print(j) 
    print()
    ###################################################

    return min(arr)

print('result : ',end='')
print(search_min(-1, 1, 0.1))

Вывод:

## mid-process
0.0
0.8409999999999997
1.5679999999999996
2.187
2.7039999999999997
3.1249999999999996
3.4559999999999995
3.703
3.872
3.969
4.0
3.971
3.8880000000000003
3.757
3.5840000000000005
3.375000000000001
3.136000000000001
2.8730000000000007
2.592000000000001
2.2990000000000017

0.0 ## result val
0 голосов
/ 26 ноября 2018

Если вам не нужны дроби полиномов, вы можете использовать numpy.polynomial:

def poly_min(poly, x_low, x_high):
    # get local minima and maxima
    x_minmax = p.deriv().roots()

    # ignore the ones out of the range
    in_range = True
    if x_low is not None:
        in_range &= x_low <= x_minmax
    if x_high is not None:
        in_range &= x_minmax < x_high
    x_minmax = x_minmax[in_range]

    # append start and end points, if needed
    x_candidates = (x_minmax,)
    if x_low is not None:
        x_candidates = (x_low,) + x_candidates
    if x_high is not None:
        x_candidates = x_candidates + (x_high,)

    # find the lowest of all possible candidates
    x_candidates = np.concatenate(x_candidates)
    return p(x_candidates).min()

from numpy.polynomial.polynomial import Polynomial
p = Polynomial([4, 1, -3])  # 4 + x^3 - 3x^2
poly_min(p, -1, 1)
0 голосов
/ 25 ноября 2018

Использование minimize из scipy.optimize:

from scipy.optimize import minimize

def fun(x):
    return x**3 - 3*x**2 + 4

fit = minimize(fun, x0=10)
print(fit.x)

Вывод:

[2.00000006]

Если вы хотите установить конкретные границы, вам необходимо использоватьодин из methods, который может его поддерживать (подробности см. methods на связанной странице документа).

from scipy.optimize import minimize

def fun(x):
    return x**3 - 3*x**2 + 4

fit = minimize(fun, x0=1, method='L-BFGS-B', bounds=((1,3),))
print(fit.x)

Вывод:

[1.99999989]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...