解决非线性方程式numpy。 [英] Solve non linear equation numpy.

查看:379
本文介绍了解决非线性方程式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和其他值。



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

推荐答案

这里是使用1D插值来计算 F(h)<的逆的解决方案。 / code>函数。由于使用非标准根查找方法,因此错误不受控制,必须谨慎选择离散化网格。但是,插值逆函数可以直接在数组上计算。

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.

注意: F 的定义已修改,现在问题是<对于F(h)= TR

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 

这篇关于解决非线性方程式numpy。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆