Python 實(shí)現(xiàn)定積分與二重定積分的操作
1.概述
最近項(xiàng)目需要使用程序?qū)崿F(xiàn)數(shù)學(xué)微積分,最初想用java實(shí)現(xiàn),后來發(fā)現(xiàn)可用文檔太少,實(shí)現(xiàn)比較麻煩,后來嘗試使用python實(shí)現(xiàn),代碼量較少,主要有sympy與scipy兩種實(shí)現(xiàn)方式,本文主要記錄scipy的實(shí)現(xiàn)方式。
2.內(nèi)容
2.1 所求函數(shù)

2.2 python代碼
# 引入需要的包 import scipy.integrate from numpy import exp from math import sqrt import math # 創(chuàng)建表達(dá)式 f = lambda x,y : exp(x**2-y**2) # 計(jì)算二重積分:(p:積分值,err:誤差) # 這里注意積分區(qū)間的順序 # 第二重積分的區(qū)間參數(shù)要以函數(shù)的形式傳入 p,err= scipy.integrate.dblquad(f, 0, 2, lambda g : 0, lambda h : 1) print(p)
2.3 注意問題
1. exp盡量使用numpy的exp
2. 注意積分區(qū)間參數(shù)的順序
3. 第二重積分的區(qū)間參數(shù)要以函數(shù)的形式傳入
補(bǔ)充:python實(shí)現(xiàn)求解積分
例子 1:
假設(shè)有隨機(jī)變量 x,定義域 X,其概率密度函數(shù)為 p(x),f(x) 為定義在 X 上的函數(shù),目標(biāo)是求函數(shù) f(x) 關(guān)于密度函數(shù) p(x) 的數(shù)學(xué)期望
。
蒙特卡洛法根據(jù)概率分布 p(x) 獨(dú)立地抽樣 n 個(gè)樣本 x1,x2,…..xn,得到近似的 f(x) 期望為:

其實(shí)這個(gè)的理解就是要求一個(gè)擁有概率密度的函數(shù)期望值
期望=積分(每個(gè)點(diǎn)的密度函數(shù)*每個(gè)點(diǎn)的價(jià)值函數(shù))
例子 2:
假設(shè)我們想要求解 h(x) 在 X 上的積分:

我們將 h(x) 分解成一個(gè)函數(shù) f(x) 和一個(gè)概率密度函數(shù) p(x) 的乘積,進(jìn)而又將問題轉(zhuǎn)換為求解函數(shù) f(x) 關(guān)于密度函數(shù) p(x) 的數(shù)學(xué)期望
:

這里的Ep(x)是相當(dāng)于把整個(gè)分布當(dāng)時(shí)了概率分布,即總發(fā)生概率為1.
這里,f(x) 表示為
,則有:

更一般的,假設(shè)我們想要求解
,熟悉積分的同學(xué)肯定已經(jīng)知道答案為
,那么如何用采樣的方法來得到這個(gè)值呢?
令
,0<x<10,那么
。
下面是代碼:
'''import random
num=1000000
sum=0
for i in range(0,num):
x=random.uniform(0,10)
sum+=x*x*10
sum/=1000000
print(sum)'''
import random
numSamples=10000
samples=[random.uniform(0,10)for _ in range(numSamples)]
f_samples=[10*sample**2 for sample in samples]
result=1/10000.0*sum(f_samples)
print(result)
result=333.10527012455066
random.uniform(x,y)表示在[x,y)之間生成一個(gè) 實(shí)數(shù)
對(duì)于復(fù)雜的 h(x),這種方法計(jì)算起來顯然就更加方便了(特別是忘記積分怎么算的同學(xué))。
蒙特卡洛方法其實(shí)就是利用大數(shù)定理通過大量統(tǒng)計(jì)來算出最后的值。
到這里為止,我們簡(jiǎn)單的介紹了蒙特卡洛方法,但是依舊沒有提到要怎么利用復(fù)雜的概率密度函數(shù)進(jìn)行采樣。
接下來我們來看一下接受-拒絕法(accept-reject sampling method),它也是蒙特卡洛法中的一種類型適用于不能直接抽樣的情況。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
PyQt實(shí)現(xiàn)界面翻轉(zhuǎn)切換效果
這篇文章主要為大家詳細(xì)介紹了PyQt實(shí)現(xiàn)界面翻轉(zhuǎn)切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
selenium使用chrome瀏覽器測(cè)試(附chromedriver與chrome的對(duì)應(yīng)關(guān)系表)
這篇文章主要介紹了selenium使用chrome瀏覽器測(cè)試(附chromedriver與chrome的對(duì)應(yīng)關(guān)系表),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
打印出python 當(dāng)前全局變量和入口參數(shù)的所有屬性
打印出python 當(dāng)前全局變量和入口參數(shù)的所有屬性的實(shí)現(xiàn)代碼。2009-07-07
pytorch教程網(wǎng)絡(luò)和損失函數(shù)的可視化代碼示例
這篇文章主要介紹了pytorch教程中網(wǎng)絡(luò)和損失函數(shù)的可視化,文中附含詳細(xì)的代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09
Python Django view 兩種return的實(shí)現(xiàn)方式
這篇文章主要介紹了Python Django view 兩種return的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Python中循環(huán)后使用list.append()數(shù)據(jù)被覆蓋問題的解決
這篇文章主要給大家介紹了關(guān)于Python中循環(huán)后使用list.append()數(shù)據(jù)被覆蓋問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
pytorch 把圖片數(shù)據(jù)轉(zhuǎn)化成tensor的操作
這篇文章主要介紹了pytorch 把圖片數(shù)據(jù)轉(zhuǎn)化成tensor的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03
使用Pycharm為項(xiàng)目創(chuàng)建一個(gè)虛擬環(huán)境完整圖文教程
這篇文章主要給大家介紹了關(guān)于使用Pycharm為項(xiàng)目創(chuàng)建一個(gè)虛擬環(huán)境的相關(guān)資料,我們?cè)谑褂胮ycharm做項(xiàng)目時(shí),最好給每一個(gè)工程都創(chuàng)建一個(gè)虛擬環(huán)境,將對(duì)應(yīng)的安裝包放在該虛擬環(huán)境中,避免項(xiàng)目與項(xiàng)目之間產(chǎn)生關(guān)系或沖突,便于管理,需要的朋友可以參考下2023-09-09

