Символически вычисляя ввод функции интерполяции?

У меня есть довольно сложная функция H(x), и я пытаюсь определить значение x так, чтобы H(x) = constant. Я хотел бы сделать это с помощью объекта интерполяции, сгенерированного из дискретного интервала и соответствующего вывода H (интервал), где другие входы остаются постоянными. Я обозначаю объект интерполяции f.

Моя проблема в том, что функция вызова объекта интерполяции принимает array_like, поэтому о передаче символа в f(x) для использования метода решателя мудреца не может быть и речи. Любые идеи о том, как обойти это?

У меня есть функция интерполяции f. Я хочу решить уравнение f(x) == sageconstant forx.

    from scipy.interpolate import InterpolatedUnivariateSpline as IUspline
    import numpy as np

    #Generating my interpolation object
    xint = srange(30,200,step=.1)
    val = [H(i,1,.1,0,.2,.005,40) for i in srange(30,299,step=.1)]
    f = IUspline(xint,val,k=4)

    #This will yield a sage constant
    eq_G(x) = freeB - x 

    #relation that I would like to solve
    eq_m(x) = eq_G(39.9) == f(x)
    m = solve(eq_m(x),x)

Приведенный выше код (точнее, f(x)) генерирует

«Ошибка типа: невозможно преобразовать данные массива из dtype («0») в dtype («float64») в соответствии с правилом «безопасно».

редактировать: любая функция H(x) приведет к той же ошибке, поэтому не имеет значения, что такое H(x). Для простоты (я не шутил, когда сказал, что H сложно), попробуйте H(x) = x. Тогда блок будет читать:

    from scipy.interpolate import InterpolatedUnivariateSpline as IUspline
    import numpy as np

    #Generating my interpolation object
    xint = srange(30,200,step=.1)
    H(x) = x
    val = [H(i) for i in srange(30,299,step=.1)]
    f = IUspline(xint,val,k=4)

    #This will yield a sage constant
    eq_G(x) = freeB - x 

    #relation that I would like to solve
    eq_m(x) = eq_G(39.9) == f(x)
    m = solve(eq_m(x),x)

person Tim Copeland    schedule 28.04.2015    source источник
comment
Предоставьте код, позволяющий другим воспроизвести ошибку. Текущий код имеет srange(30, 200, step=.1) вместо xint, но srange(30, 299, step=.1) вместо val, и это 200 против 299 вызывает ошибку при копировании и вставке. Тогда freeB не определено. Как правило, всегда проверяйте правильность постановки вопроса путем копирования и вставки в новый сеанс Sage, а затем копирования и вставки из этого сеанса точного ввода, вывода и сообщения об ошибке. Может быть, не имеет значения, что такое freeB, но важно, могут ли другие воспроизвести ошибку, чтобы исследовать и помочь решить проблему.   -  person Samuel Lelièvre    schedule 01.05.2019


Ответы (1)


При работе с numpy и scipy предпочитайте типы Python типам Sage.

Вместо целых и вещественных чисел Sage используйте целые числа и числа с плавающей запятой Python.

Может быть, вы можете исправить свой код следующим образом.

from scipy.interpolate import InterpolatedUnivariateSpline as IUspline
import numpy as np

# Generate interpolation object
xint = srange(30,200,step=.1)
xint = [float(x) for x in xint]
val = [float(H(i,1,.1,0,.2,.005,40)) for i in srange(30,299,step=.1)]
f = IUspline(xint,val,k=4)

# This will yield a Sage constant
eq_G(x) = freeB - x 

# relation that I would like to solve
eq_m(x) = eq_G(39.9) == f(x)
m = solve(eq_m(x),x)
person Samuel Lelièvre    schedule 30.04.2015
comment
Генерация объекта интерполяции не является проблемой, поэтому преобразование xint в целые числа python ничего не меняет. Настоящая проблема заключается в том, что объект интерполяции будет принимать только объекты типа array_like, что делает невозможным передачу символа в f для использования для решения x в отношении eq_m(x) = eq_G(39.9) == f(x) - person Tim Copeland; 30.04.2015