Решите нелинейное уравнение numpy.

Редактировать: Все хорошо :)

 This is a code which works with small values of t=20 and TR=([[30,20,12,23..],[...]]) but when I put higher values it is shown "Expect x to be a 1-D sorted array_like.". Do you know how to solve this problem??  

import matplotlib.pylab as plt
from scipy.special import erfc
from scipy import  sqrt
from scipy import  exp
import numpy as np
from scipy.interpolate import interp1d




# The function to inverse:
t = 100
alfa = 1.1*10**(-7)
k = 0.18
T1 = 20
Tpow = 180

def F(h):
    p = erfc(h*sqrt(alfa*t)/k)
    return T1 + (Tpow-T1)*(1-exp((h**2*alfa*t)/k**2)*(p))

# Interpolation 
h_eval = np.linspace(-80, 500, 200)   # critical step: define the discretization grid
F_inverse = interp1d( F(h_eval), h_eval, kind='cubic', bounds_error=True )


# Some random data:
TR = np.array([[130, 100, 130, 130, 130],
       [ 90, 101, 100, 120,  90],
       [130, 130, 100, 100, 130],
       [120, 101, 120,  90, 110],
       [110, 130, 130, 110, 130]])

# Compute the array h for a given array TR
h = F_inverse(TR)
print(h)

# Graph to verify the interpolation 
plt.plot(h_eval, F(h_eval), '.-', label='discretized F(h)');
plt.plot(h.ravel(), TR.ravel(), 'or', label='interpolated values')
plt.xlabel('h'); plt.ylabel('F(h) or TR'); plt.legend();


Кто-нибудь знает, как решить нелинейное неявное уравнение в numpy. У меня есть массив TR и другие значения, которые включены в мое уравнение.

Мне нужно ее решить - в результате получить новый массив такой же формы


person Duraa    schedule 19.08.2018    source источник
comment
Что делает F(h)? С какой именно проблемой вы столкнулись?   -  person Sheldore    schedule 19.08.2018
comment
У меня есть уравнение: 0=TR+(Tpow-T1)*(1-np.exp(h2*alfat/k2)+2/(3*np.sqrt(3 ))*h3*(alfat)**(3/2)/k3), где h — мое неизвестное значение. Я хочу найти решение этого уравнения. (учитывайте, что TR это массив) Заранее спасибо   -  person Duraa    schedule 19.08.2018


Ответы (1)


Вот решение, использующее интерполяцию 1D для вычисления обратной функции F(h). Поскольку используется не стандартный метод поиска корня, ошибка не контролируется, и сетка дискретизации должна выбираться с осторожностью. Однако интерполированная обратная функция может быть непосредственно вычислена по массиву.

примечание: определение F изменено, проблема теперь Solve h for F(h) = TR

import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pylab as plt

# The function to inverse:
t = 10
alfa = 1.1*10**(-7)
k = 0.18
T1 = 20
Tpow = 100

def F(h):
    A = np.exp(h**2*alfa*t/k**2)
    B = h**3*2/(3*np.sqrt(3))*(alfa*t)**(3/2)/k**3
    return -(Tpow-T1)*( 1 - A + B )

# Interpolation 
h_eval = np.linspace(40, 100, 50)   # critical step: define the discretization grid
F_inverse = interp1d( F(h_eval), h_eval, kind='cubic', bounds_error=True )


# Some random data:
TR = np.array([[13, 10, 13, 13, 13],
       [ 9, 11, 10, 12,  9],
       [13, 13, 10, 10, 13],
       [12, 11, 12,  9, 11],
       [11, 13, 13, 11, 13]])

# Compute the array h for a given array TR
h = F_inverse(TR)
print(h)

# Graph to verify the interpolation 
plt.plot(h_eval, F(h_eval), '.-', label='discretized F(h)');
plt.plot(h.ravel(), TR.ravel(), 'or', label='interpolated values')
plt.xlabel('h'); plt.ylabel('F(h) or TR'); plt.legend();

С помощью другой функции изменяются следующие строки:

from scipy.special import erf
def F(h):
    return (Tpow-T1)*(1-np.exp((h**2*alfa*t)/k**2)*(1.0-erf(h*np.sqrt(alfa*t)/k)))

# Interpolation 
h_eval = np.linspace(15, 35, 50)   # the range is changed 
person xdze2    schedule 19.08.2018
comment
большое спасибо - это работает отлично с этим уравнением, но когда я пытаюсь использовать (Tpow-T1)*(1-exp((h**2*alfa*t)/k**2)*(1.0-erf(h*sqrt(alfa*t)/k))) вместо -(Tpow-T1)*( 1 - A + B ) возникает ошибка: AttributeError: 'ImmutableDenseNDimArray' object has no attribute 'extract_multiplicatively' - person Duraa; 22.08.2018
comment
Я протестировал функцию, и она работает хорошо: какую функцию erf вы используете? Она из Scipy? - person xdze2; 22.08.2018
comment
Я только что обновил весь код, чтобы проверить - если бы вы могли, конечно :) - person Duraa; 22.08.2018
comment
Будьте внимательны, из какой библиотеки импортируются математические функции: scipy и numpy работают с nd-массивом, а sympy — это что-то другое и не работает с nd-массивом. - person xdze2; 22.08.2018
comment
Спасибо большое теперь все ок - person Duraa; 22.08.2018
comment
Можно ли вычислить этот код, если T1 тоже является массивом? (с той же формой, что и TR). Возьмите переменную из TR[1,1] и из T1[1,1], затем TR[2,2] и T1[2,2] и так далее... вычислите ее по моему уравнению и поместите в массив h - person Duraa; 22.08.2018
comment
может быть, вы могли бы сократить уравнение до одномерного случая, например, решить F(h) == TR/(Tpow-T1), где TR/(Tpow-T1) вычисляется поэлементно? Выполнение 2D-интерполяции возможно, но становится сложнее проверить правильность используемой дискретизации. - person xdze2; 22.08.2018
comment
Я постараюсь это сделать. Действительно спасибо за вашу помощь, я ценю это. Я также задал новый вопрос о проблеме, связанной с двумя массивами, возможно, у sb есть простое решение для нее. Я просто новичок в таких делах. Спасибо еще раз - person Duraa; 22.08.2018