Solve non linear equation numpy.

烂漫一生 提交于 2019-12-11 15:44:16

问题


Edit: Everything is good :)

 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();


Has anyone an idea how to solve non-linear, implicit equation in numpy. I have array TR and other values which are included in my equation.

I need to solve it - as a result receive a new array with the same shape


回答1:


Here is a solution using an 1D interpolation to compute the inverse of the F(h) function. Because non standard root finding method is used, the error is not controlled, and the discretization grid have to be chosen with care. However, the interpolated inverse function can be directly computed over an array.

note: the definition of F is modified, the problem is now 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();

With the other function, the following lines are changed:

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 


来源:https://stackoverflow.com/questions/51920645/solve-non-linear-equation-numpy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!