Как вызвать ndarray в другой функции в numpy? - PullRequest
0 голосов
/ 30 декабря 2018

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

import numpy as np

x = np.linspace(0, 3)
f = 14 * x * np.exp(x - 2) - 12 * np.exp(x - 2) - 7 * x ** 3 + 20 * x ** 2 - 26 * x + 12

def bolzano(function, lower, upper):
    if function(lower) * function(upper) < 0:
        return True
    else:
        return False


def bisection(function, lower, upper):
    m = (lower + upper) / 2
    while function(m) > 10 ** -6:
        if bolzano(function, lower, m):
            upper = m
        else:
            lower = m
        m = (lower + upper) / 2
    return float(m)


b = bisection(f, 0, 3)
print(b)

Однако, когда я пытаюсь запустить его, я получаю эту ошибку

Traceback (most recent call last):
  File "C:/Users/user/PycharmProjects/untitled/Test.py", line 31, in <module>
     b = bisection(f, 0, 3)
  File "C:/Users/user/PycharmProjects/untitled/Test.py", line 22, in 
     bisection while function(m) > 10 ** -6:
TypeError: 'numpy.ndarray' object is not callable

Я пытался привести элементы в функции деления на части к известным типам данных, но это не помогло.Большинство постов о ndarrays посвящены ... ну, массивам, которыми я не пользуюсь, поэтому не повезло найти решение там.Есть идеи?

1 Ответ

0 голосов
/ 30 декабря 2018

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

import numpy as np
x = np.linspace(0, 3)

def f(x):
    return 14 * x * np.exp(x - 2) - 12 * np.exp(x - 2) - 7 * x ** 3 + 20 * x ** 2 - 26 * x + 12

# bolzano function here

# bisection function here

b = bisection(f, 0, 3)
print(b)
# 1.5

Поскольку вы оцениваете свою функцию для скалярных входов, как указывает @hpaulj, вам лучше использовать math.exp вместо np.exp.Первый ожидает только скалярный ввод в отличие от второго, который также принимает векторы.

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