#coding:utf-8
十載的靜寧網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整靜寧建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“靜寧網(wǎng)站設(shè)計”,“靜寧網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
#一階導(dǎo)
def?fun1(X,?WINDOW?=?5):
result?=?[]
for?k?in?range(WINDOW,?len(X)-WINDOW):
mid?=?(X[k+WINDOW]-X[k-WINDOW])/(2*WINDOW)
result.append(mid)
return?result
#二階導(dǎo)
def?fun2(X,?WINDOW?=?5):
result?=?[]
for?k?in?range(WINDOW,?len(X)-WINDOW):
mid?=?(X[k+WINDOW]-2*X[k]+X[k-WINDOW])/(WINDOW*WINDOW)
result.append(mid)
return?result
X?=?[1,2,3,4,5,6,7,8,9,10]
result1?=?fun1(X,?3)
result2?=?fun2(X,?2)
如上自己寫,或者用numpy自帶的多項式的n階導(dǎo)函數(shù)。
得到多項式的n階導(dǎo)函數(shù):多項式.deriv(m = n)
from?numpy?import?*
X?=?[1,2,3,4,5,6,7,8,9,10]
result?=?X.deriv(m?=?n)?#n是導(dǎo)數(shù)階數(shù)
你需要知道在任意點多的一階導(dǎo)數(shù)
也就是已知f'(n)=g(n)
那么f(n)=∫g(n)dn
計算這個積分就可以了
使用sympy.diff求導(dǎo)
from?sympy?import?*init_printing(use_unicode=True)x?=?symbols("x")f?=?log(x)
一階導(dǎo)數(shù)
diff(f,?x)
二階導(dǎo)數(shù)可以傳入第三個參數(shù),表示階數(shù)
diff(f,?x,?2)
希望可以幫助到你。
打開python運行環(huán)境。
導(dǎo)入微分的模塊包:from sympy import *。
定義符號變量:x = symbols('x')
定義一個函數(shù):f = x**9
diff = diff(f,x)求導(dǎo)
最后輸入diff,即可顯示其變量值了。
眾多python培訓視頻,盡在python學習網(wǎng),歡迎在線學習!
常用形式
odeint(func, y0, t,args,Dfun)
一般這種形式就夠用了。
下面是官方的例子,求解的是
D(D(y1))-t*y1=0
為了方便,采取D=d/dt。如果我們令初值
y1(0) = 1.0/3**(2.0/3.0)/gamma(2.0/3.0)
D(y1)(0) = -1.0/3**(1.0/3.0)/gamma(1.0/3.0)
這個微分方程的解y1=airy(t)。
令D(y1)=y0,就有這個常微分方程組。
D(y0)=t*y1
D(y1)=y0
Python求解該微分方程。
from scipy.integrate import odeint
from scipy.special import gamma, airy
y1_0 = 1.0/3**(2.0/3.0)/gamma(2.0/3.0)
y0_0 = -1.0/3**(1.0/3.0)/gamma(1.0/3.0)
y0 = [y0_0, y1_0]
def func(y, t):
... return [t*y[1],y[0]]
def gradient(y,t):
... return [[0,t],[1,0]]
x = arange(0,4.0, 0.01)
t = x
ychk = airy(x)[0]
y = odeint(func, y0, t)
y2 = odeint(func, y0, t, Dfun=gradient)
print ychk[:36:6]
[ 0.355028 0.339511 0.324068 0.308763 0.293658 0.278806]
print y[:36:6,1]
[ 0.355028 0.339511 0.324067 0.308763 0.293658 0.278806]
print y2[:36:6,1]
[ 0.355028 0.339511 0.324067 0.308763 0.293658 0.278806]
得到的解與精確值相比,誤差相當小。
=======================================================================================================
args是額外的參數(shù)。
用法請參看下面的例子。這是一個洛侖茲曲線的求解,并且用matplotlib繪出空間曲線圖。(來自《python科學計算》)
from scipy.integrate import odeint
import numpy as np
def lorenz(w, t, p, r, b):
# 給出位置矢量w,和三個參數(shù)p, r, b 計算出
# dx/dt, dy/dt, dz/dt 的值
x, y, z = w
# 直接與lorenz 的計算公式對應(yīng)
return np.array([p*(y-x), x*(r-z)-y, x*y-b*z])
t = np.arange(0, 30, 0.01) # 創(chuàng)建時間點
# 調(diào)用ode 對lorenz 進行求解, 用兩個不同的初始值
track1 = odeint(lorenz, (0.0, 1.00, 0.0), t, args=(10.0, 28.0, 3.0))
track2 = odeint(lorenz, (0.0, 1.01, 0.0), t, args=(10.0, 28.0, 3.0))
# 繪圖
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
fig = plt.figure()
ax = Axes3D(fig)
ax.plot(track1[:,0], track1[:,1], track1[:,2])
ax.plot(track2[:,0], track2[:,1], track2[:,2])
plt.show()
===========================================================================
scipy.integrate.odeint(func, y0, t, args=(), Dfun=None, col_deriv=0, full_output=0, ml=None, mu=None, rtol=None, atol=None, tcrit=None, h0=0.0, hmax=0.0, hmin=0.0, ixpr=0, mxstep=0, mxhnil=0, mxordn=12, mxords=5, printmessg=0)
計算常微分方程(組)
使用 FORTRAN庫odepack中的lsoda解常微分方程。這個函數(shù)一般求解初值問題。
參數(shù):
func : callable(y, t0, ...) 計算y在t0 處的導(dǎo)數(shù)。
y0 : 數(shù)組 y的初值條件(可以是矢量)
t : 數(shù)組 為求出y,這是一個時間點的序列。初值點應(yīng)該是這個序列的第一個元素。
args : 元組 func的額外參數(shù)
Dfun : callable(y, t0, ...) 函數(shù)的梯度(Jacobian)。即雅可比多項式。
col_deriv : boolean. True,Dfun定義列向?qū)?shù)(更快),否則Dfun會定義橫排導(dǎo)數(shù)
full_output : boolean 可選輸出,如果為True 則返回一個字典,作為第二輸出。
printmessg : boolean 是否打印convergence 消息。
返回: y : array, shape (len(y0), len(t))
數(shù)組,包含y值,每一個對應(yīng)于時間序列中的t。初值y0 在第一排。
infodict : 字典,只有full_output == True 時,才會返回。
字典包含額為的輸出信息。
鍵值:
‘hu’ vector of step sizes successfully used for each time step.
‘tcur’ vector with the value of t reached for each time step. (will always be at least as large as the input times).
‘tolsf’ vector of tolerance scale factors, greater than 1.0, computed when a request for too much accuracy was detected.
‘tsw’ value of t at the time of the last method switch (given for each time step)
‘nst’ cumulative number of time steps
‘nfe’ cumulative number of function evaluations for each time step
‘nje’ cumulative number of jacobian evaluations for each time step
‘nqu’ a vector of method orders for each successful step.
‘imxer’index of the component of largest magnitude in the weighted local error vector (e / ewt) on an error return, -1 otherwise.
‘lenrw’ the length of the double work array required.
‘leniw’ the length of integer work array required.
‘mused’a vector of method indicators for each successful time step: 1: adams (nonstiff), 2: bdf (stiff)
其他參數(shù),官方網(wǎng)站和文檔都沒有明確說明。相關(guān)的資料,暫時也找不到。
python有個符號計算的庫叫sympy,可以直接用這個庫求導(dǎo)數(shù)然后解導(dǎo)數(shù)=0的方程,參考代碼如下:
from sympy import *
x = symbols('x')
y = (x-3)**2+2*sin(x)-3*x+1
eq = diff(y, x)
solve(eq, x)