2016-11-28 77 views
0

以下語法非常直觀。在Spyder中運行,並繪製非線性函數。matplotlib如何接受函數參數?他們是lambda?

import numpy as numpy 
import matplotlib.pyplot as plot 

x = numpy.arange(0, 1, 0.01) 

def nonlinear(x, deriv=False): #sigmoid 
     if (deriv==True): 
       return x*(1-x) 

     return 1/(1-numpy.exp(-x)) 

plot.plot(x, nonlinear(x)) 

我的問題是,如何功能nonlinear傳遞給plot.plot?這是拉姆達嗎? nonlinear如何在數學運算時不會崩潰而接受數組?

+0

乙狀結腸癌是'1 /(1 + exp(-x))順便說一下。 「 – arshajii

+0

」函數非線性如何傳遞給plot.plot?「不是這樣。 – Goyo

回答

3

它工作正常,因爲通常的算術運算(例如/-就像你用過的那樣)是爲numpy數組定義的;他們只是執行元素明智的。 np.exp()也是如此。您可以看到究竟是什麼nonlinear(x)看起來像自己(這也是一個numpy的陣列):

>>> import numpy as np 
>>> def nonlinear(x): return 1/(1 + np.exp(-x)) 
... 
>>> nonlinear(np.arange(0, 1, 0.1)) 
array([ 0.5  , 0.52497919, 0.549834 , 0.57444252, 0.59868766, 
     0.62245933, 0.64565631, 0.66818777, 0.68997448, 0.7109495 ]) 

你只是找到指定範圍內的每個點評估乙狀結腸的值,然後把這些爲y - 值爲plot

1

的matplotlib plot功能需要兩個列表(或numpy的數組)作爲x和y的參數。正如arshajii所回答的,語法是vaild,因爲在nonlinear函數的返回語句(這非常好)中,numpy數組x被評估爲元素。但是,如果非線性函數包括逐個情況的操作,則不可能再有numpy評估(沒有進一步的numpy-magic)。例如看這個連續可微,但不光滑的功能:

from pylab import * 

def nonlinear(x, x0=2): 
     return x**2 if x < x0 else 2*x0*(x - x0) + x0**2 

x = linspace(0, 5, 100) 
y = nonlinear(x) 

最後一行上升錯誤:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

而是使用列表理解

y = [nonlinear(x_, x0=2.5) for x_ in x] 
plot(x, y) 
show() 

這導致下圖 non-smooth function

相關問題