亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Python在數(shù)值分析中的應(yīng)用

        2025-08-18 00:00:00石也牧
        科技風(fēng) 2025年22期

        摘 要:數(shù)值分析是理科專業(yè)重要的基礎(chǔ)課之一,Python語言在數(shù)值分析中的應(yīng)用廣泛而深入。NumPy是Python中最基礎(chǔ)的科學(xué)計算庫之一,它提供了多維數(shù)組對象,具備許多數(shù)學(xué)函數(shù),能夠處理大型矩陣。SciPy是建立在NumPy之上的庫,在工程計算方面有豐富的功能子模塊。Matplotlib是一款用于數(shù)據(jù)可視化的Python繪圖庫,它支持多種圖表,包括線圖、散點圖、柱狀圖、餅圖、等高線圖等。本文給出了應(yīng)用Python程序解決數(shù)值分析常見問題的示例,展示了這幾個流行庫的基本功能,為數(shù)值分析知識的學(xué)習(xí)和掌握提供了借鑒。

        關(guān)鍵詞:Python語言;數(shù)值分析;數(shù)值解;解析解

        數(shù)值分析和Python都是人工智能和數(shù)據(jù)科學(xué)等許多理工科專業(yè)的必修科目。數(shù)值分析也稱為計算數(shù)學(xué),是研究如何在計算機上求解問題的一個數(shù)學(xué)分支。Python是目前最流行的語言之一,它簡單易學(xué)、免費開源、各類模塊資源非常豐富。隨著Python的興起,早期使用其他語言(如Fortran和MATLAB)做數(shù)值計算的許多用戶開始使用Python語言。Python在數(shù)值分析方面的模塊有很多,功能十分強大,用戶不必關(guān)注當(dāng)中的函數(shù)是如何實現(xiàn)的,可直接調(diào)用。以下通過幾個實例,介紹Python程序在數(shù)值分析中的應(yīng)用。

        1 解線性方程組

        線性方程組有很多種解法,如高斯消去法和雅可比迭代法[1]。使用NumPy庫可以直接求解,而不必考慮具體的求解過程。函數(shù)numpy.linalg.solve()用于解決形如Ax=B的線性方程組,其中A為系數(shù)矩陣,B為等號右側(cè)數(shù)值組成的列向量,x為未知數(shù)列向量。例如,有如下方程組:

        5x1-4x2+x3=2

        -4x1+6x2-4x3=-1

        x1-4x2+6x3=-1

        相應(yīng)的解該方程組的Python代碼如下:

        import numpy as np

        A=np.array([[5,-4,1],[-4,6,-4],[1,-4,6]])

        B=np.array([2,-1,-1])

        x=np.linalg.solve(A,B)

        print(x)

        運行結(jié)果為:

        [0.33333333-0.16666667-0.33333333]

        即x1=1/3,x2=-1/6,x3=-1/3,代入原方程驗證,這個結(jié)果是正確的。

        2 數(shù)值微分

        有的函數(shù)導(dǎo)數(shù)沒有解析解,則函數(shù)的差商可以作為其導(dǎo)數(shù)的近似值,即:

        y′=df(x)dx≈f(x+h)-f(x)h

        式中的h必須是一個很小的數(shù),當(dāng)h無限趨近于0時,上式就是導(dǎo)數(shù)的定義式。上式是向前差商,也可以采用向后差商或者中心差商近似代替導(dǎo)數(shù)[2]。

        下面的代碼中,自定義了差商函數(shù)derivative(),參數(shù)f和a表示求函數(shù)f在a處的差商,參數(shù)md的默認值是central,表示中心差商,md也可以取forward(向前差商)或者backward(向后差商)。我們知道正弦函數(shù)的導(dǎo)數(shù)是余弦函數(shù),即,sin'(x)=cos(x),下面的代碼使用差商函數(shù)求sin'(x)的數(shù)值解:

        def derivative(f,a,md='central',h=0.01):

        if md=='central':

        return(f(a+h)-f(a-h))/(2*h)

        elif md=='forward':

        return(f(a+h)-f(a))/h

        else:#'backward':

        return(f(a)-f(a-h))/h

        x=np.linspace(0,5*np.pi,100)

        dy_dx=derivative(np.sin,x)

        y=np.cos(x)

        plt.plot(x,y,\"b.\",label='y=cos(x)')

        plt.plot(x,dy_dx,label=\"y=sin'(x)\")

        plt.legend()

        plt.grid(True)

        plt.show()

        代碼的后半部分使用子模塊matplotlib.pyplot這個最常用的Python繪圖工具將cos(x)曲線和sin'(x)數(shù)值解的散點畫在了同一幅圖中,以便于對比。如圖1所示,連續(xù)的曲線表示cos(x),散點*表示sin'(x)數(shù)值解,顯然,sin'(x)數(shù)值解與cos(x)非常吻合。

        3 數(shù)值積分

        積分運算,包括牛頓柯特斯公式、復(fù)合(梯形與辛普森)求積公式和龍貝格公式等[3]。例如,求解下面的定積分值:

        ∫2π0xsin(x)dx

        SciPy庫的子模塊integrate主要用于數(shù)值積分的運算。將函數(shù)表達式f(x),積分下限a與積分上限b代入函數(shù)integrate.quad(f,a,b)當(dāng)中,可計算出定積分值。這里,f(x)=xsin(x),a=0,b=2π,相應(yīng)的Python代碼如下:

        import math

        from scipy import integrate

        def f(x):

        return x*math.sin(x)

        Ifx,err=integrate.quad(f,0,2*math.pi)

        print('定積分為:',Ifx)

        print('誤差為:',err)

        運行結(jié)果為:

        定積分為:-6.2831853071795845

        誤差為:1.382265978143112e-13

        看來誤差非常小,說明計算精度比較高。同時不難看出,定積分的值約為-6.28,十分接近-2π,實際上,通過分步積分容易求得,其準確值就是-2π。SymPy是一個以符號運算為主的Python庫,支持解析解運算,應(yīng)用它對前面的定積分進行符號運算求解,相應(yīng)的代碼如下:

        from sympy import *

        x=Symbol(\"x\")

        Fx=x*sin(x)

        IFx =integrate(Fx,(x,0,2*pi))

        print(IFx)

        運行結(jié)果為:

        -2*pi

        這里的pi是SymPy中的符號,表示π。

        4 解常微分方程

        下面是一個有解析解的、并有初值條件的一階微分方程:y′=x2+x-y,y(0)=0。

        將方程變形為:y′+y-x2-x=0。

        相應(yīng)求解析解的Python程序如下,代碼中的f1就是上式的等號左邊的表達式,ics為初值條件y(0)=0:

        from sympy import *

        x=symbols(\"x\")

        y=symbols(\"y\",cls=Function)

        f1=diff(y(x),x)+y(x)-x**2-x

        result=dsolve(f1,y(x),ics={y(0):0})

        print(result)

        運行結(jié)果為:

        Eq(y(x),x**2-x+1-exp(-x))

        即解析解為:

        y=x2-x+1-e-x

        多數(shù)微分方程是沒有解析解的,只能求數(shù)值解,方法有歐拉法、梯形法和龍格庫塔法等[4]。Python子模塊scipy.integrate中的函數(shù)odeint()用于計算微分方程的數(shù)值解。

        上述原始微分方程的等號右邊為x2+x-y,也就是y′的表達式,將其定義為函數(shù)dfun(y,x),x的散點取0到1.1,步長為0.05,相應(yīng)的求該微分方程數(shù)值解的代碼如下:

        from scipy.integrate import odeint

        def dfun(y,x):

        return x*x+x-y

        x=np.arange(0,1.1,0.05)

        f2=x*x-x+1-np.exp(-x)

        ans=odeint(dfun,0,x)

        plt.plot(x,ans,\"b*\",label='Numerical')

        plt.plot(x,f2,\"red\",label='Analytical')

        plt.grid()

        plt.legend(loc=\"best\")

        plt.show()

        為了比較數(shù)值解和解析解的相近程度,在上面的代碼里包含了解析解(用f2表示),使用子模塊matplotlib.pyplot在同一張圖中畫出了數(shù)值解的散點和解析解的曲線,如圖2所示。

        可見,函數(shù)odeint()的計算結(jié)果是比較準確的。

        5 最小二乘擬合

        最小二乘擬合的基本原理是,通過給定數(shù)據(jù)點,尋找一個函數(shù)的近似表達式。具體地說,有一組(m個)實驗數(shù)據(jù)(xi,yi),假設(shè)它們之間應(yīng)該滿足某函數(shù)關(guān)系y=f(x),例如,如果是線性關(guān)系,則f(x)=kx+b,k和b就是待定參數(shù)。找到一組k和b的值,使得下面的誤差的平方和最?。?/p>

        s(k,b)=∑mi=1[yi-f(xi)]2

        有了k和b的值就得到了函數(shù)的近似表達式,這種算法就稱為最小二乘擬合[5]。

        下面的程序,先使用隨機函數(shù),生成101個近似地處在一條直線的散點,然后利用scipy.optimize模塊中的函數(shù)curve_fit()找到最佳參數(shù)值:

        x=np.linspace(0,1,101)

        y=1+x+0.1*np.random.random(len(x))

        def func(x,k,b):

        return k*x+b

        k,b=curve_fit(func,xdata=x,ydata=y)[0]

        print('k=',k)

        print('b=',b)

        plt.plot(x,y,\"b.\")

        plt.plot(x,k*x+b,\"r\")

        plt.grid()

        plt.show()

        運行結(jié)果為:

        k=1.0013726989903353

        b=1.0448271910479061

        在同一張圖中畫出了模擬的散點圖和擬合出來的直線,如圖3所示??梢姡Ⅻc在直線兩側(cè)的分布比較均勻,說明擬合效果較好。

        6 特征值與特征向量

        求矩陣特征值和特征向量的基本方法有:冪法與反冪法、QR算法以及雅可比法(針對實對稱矩陣)。子模塊numpy.linalg中的函數(shù)eig()用于求解特征值和特征向量。例如,有如下矩陣A:

        A=120

        2-11

        013

        相應(yīng)的求特征值和特征向量的Python程序如下:

        import numpy as np

        from numpy.linalg import eig

        A=np.array([[1,2,0],[2,-1,1],[0,1,3]])

        eigenvalue,eigenvector=eig(A)

        print(eigenvalue)

        print(eigenvector)

        運行結(jié)果為:

        [-2.37228132 2. 3.37228132]

        [[0.50369186 0.81649658 0.28218405]

        [-0.84929533 0.40824829 0.33470998]

        [0.1580884 -0.40824829 0.89907808]]

        可以驗證程序運行結(jié)果是正確的。

        結(jié)語

        以上例子都比較簡單,實際上,使用Python還可以進行插值運算、傅里葉變換、求解偏微分方程和非線性方程組等,在數(shù)值積分方面,還可以計算多重積分。本文未提及的數(shù)值計算方面的Python(子)模塊還有很多,作為數(shù)值分析的學(xué)習(xí)者和工作者,不能僅關(guān)心如何使用Python相應(yīng)的模塊工具求解,更應(yīng)該掌握每種解法背后的數(shù)學(xué)原理及求解過程的來龍去脈,這樣才能確保在學(xué)習(xí)的道路上步伐邁得穩(wěn)且走得遠。

        參考文獻:

        [1]李慶揚.數(shù)值分析[M].5版.北京:清華大學(xué)出版社,2008:142188.

        [2]RAJAT SHARMA.Numerical Methods in Python[EB/OL].[20240704].https://medium.com/.

        [3]朱曉臨.數(shù)值分析[M].2版.合肥:中國科學(xué)技術(shù)大學(xué)出版社,2014:230248.

        [4]孔慶凱.Python編程與數(shù)值方法[M].北京:機械工業(yè)出版社,2023:289298.

        [5]尹紅麗.Python科學(xué)計算數(shù)據(jù)處理與分析[M].北京:人民郵電出版社,2023:237240.

        作者簡介:石也牧(2004— ),女,漢族,北京人,本科,研究方向:人工智能。

        青青草视频国产在线观看| 亚洲国产成人久久一区| 精品免费在线| 曰本亚洲欧洲色a在线| 人妻少妇偷人精品一区二区| 久久婷婷国产综合精品| 骚小妹影院| 国产免费看网站v片不遮挡| 久久精品亚洲乱码伦伦中文| 日本精品视频免费观看| 国产精品网站在线观看免费传媒 | 美女黄18以下禁止观看| 无码流畅无码福利午夜| 国产黄色一区二区在线看 | 欧美成人专区| 日本高清不卡一区二区三区| av网站在线观看大全| 亚洲av日韩av在线观看| 久久国产偷| 国产大全一区二区三区| 精品人妻少妇av中文字幕| 亚洲色欲色欲综合网站| 97精品国产91久久久久久久 | 日产精品久久久一区二区| 中文字幕无线码中文字幕| 99在线无码精品秘 入口九色| 国产三级精品三级在线专区| 美女网站免费福利视频| 人妻丰满av∨中文久久不卡| 丰满人妻无奈张开双腿av| 日本免费大片一区二区| 欧美大肥婆大肥bbbbb| 99久久国产亚洲综合精品| 精品国产av一区二区三区| 久久精品国产亚洲av麻豆长发| 亚洲色偷拍区另类无码专区| 无码国产一区二区色欲| 中文字幕漂亮人妻在线| 国产国拍精品av在线观看按摩| 不卡国产视频| 激情五月天色婷婷久久|