Scipy入門(求解方程組2)

2021-03-02 Python數據分析之旅

一.非線性方程組

     在前面我們討論的大多數是關於未知數的線性方程組,本節主要討論非線性方程組,簡單的理解為不是關於未知數(不一定是x)的一次方程,比如我們熟悉的x^2-4x+3=0這種方程組但是這種方程比較簡單,我們可以利用一些公式直接解出其解,但是對於x^3-sin(x)=0這種方程,我們是沒有通用公式的解出它的解,這時我們就要採取一些其他方法來求解。本節我們主要採取的是採用迭代循環方法進行求解,比較典型方法有二分法和牛頓法。(其實這兩種方法的基礎就是通過畫圖來大概確定解範圍,從而在相應區間進行求解)

一.畫圖求解範圍

import numpy as npimport matplotlib.pyplot as pltx=np.linspace(-2,2,1000)
f1=x**3-x**2-xf2=x-3 * np.sin(x)f3=np.exp(x)-2f4=np.sin(x)-x**2
fig,axes=plt.subplots(1,4,figsize=(12, 3),sharey=True)
for n,f in enumerate([f1,f2,f3,f4]):    axes[n].plot(x,f,lw=1.5)    axes[n].axhline(0,ls=':',color='k')    axes[n].set_ylim(-5,5)    axes[n].set_xticks([-2,-1,0,1,2])    axes[n].set_xlabel('x',fontsize=18)
axes[0].set_ylabel('f(x)',fontsize=18)
titles = [r'$f(x)=x^3-x^2-x$',r'$f(x)=x-3*sin(x)$',          r'$f(x)=\exp(x)-2$',r'$f(x)=sin(x)-x^2$']for n,title in enumerate(titles): axes[n].set_title(title) fig.tight_layout()plt.show()

運行結果

二.二分法求解

import numpy as npimport matplotlib.pyplot as pltplt.rcParams["font.family"] = "SimHei"plt.rcParams["font.size"] = "12"f=lambda x: np.exp(x) - 2tol=0.1a,b=-2,2x=np.linspace(-2.1, 2.1, 1000)
fig,ax=plt.subplots(1,1,figsize=(12, 4))
ax.plot(x,f(x),lw=1.5)
ax.axhline(0,ls=':',color='k')ax.set_xticks([-2,-1,0,1,2])ax.set_xlabel('x',fontsize=18)ax.set_ylabel('f(x)',fontsize=18)
fa,fb=f(a),f(b)
ax.plot(a,fa,'ko')ax.plot(b,fb,'ko')ax.text(a,fa+0.5,"a",ha='center',fontsize=18)ax.text(b,fb+0.5,"b",ha='center',fontsize=18)
n=1while b-a>tol:    m=a+(b-a)/2 fm=f(m) ax.plot(m,fm,'ko') ax.text(m,fm-0.5,r"$m_%d$"%n,ha='center') n+=1 if np.sign(fa)==np.sign(fm): a,fa=m,fm else: b,fb=m,fm
ax.plot(m,fm,'r.',markersize=10)ax.annotate("方程根的大約範圍 %.3f"% m, fontsize=14,family="SimHei", xy=(a,fm),xycoords='data', xytext=(-150,+50),textcoords='offset points', arrowprops=dict(arrowstyle="->",connectionstyle="arc3,rad=-.5"))
ax.set_title("二分法求解方程組")plt.show()print('總的迭代次數為%d'%n)

                                              作者對原始碼進行了改進

運行結果

總的迭代次數為7(由於我們之前已經畫圖大概確定了它的解範圍,因此迭代效率總體來說還是很高的)

三.牛頓法

import numpy as npimport matplotlib.pyplot as pltimport sympyplt.rcParams["font.family"] = "SimHei"plt.rcParams["font.size"] = "12"
tol=0.01xk=2
s_x=sympy.symbols("x")s_f=sympy.exp(s_x)-2
f=lambda x:sympy.lambdify(s_x,s_f)(x)fp=lambda x:sympy.lambdify(s_x,sympy.diff(s_f,s_x))(x)
x=np.linspace(-1,2.1,1000)
fig,ax=plt.subplots(1,1,figsize=(12,4))ax.plot(x,f(x))
ax.axhline(0,ls=':',color='k')
n=0while f(xk)>tol: xk_new=xk-f(xk)/fp(xk) ax.plot([xk,xk],[0,f(xk)],color='k',ls=':') ax.plot(xk,f(xk),'ko') ax.text(xk,-.5,r'$x_%d$'% n,ha='center') ax.plot([xk,xk_new],[f(xk),0],'k-') xk=xk_new n+=1
ax.plot(xk,f(xk),'r.',markersize=15)ax.annotate("方程根的大約範圍為%.3f"%xk, fontsize=14,family="SimHei", xy=(xk,f(xk)),xycoords='data', xytext=(-150,+50),textcoords='offset points', arrowprops=dict(arrowstyle="->",connectionstyle="arc3,rad=-.5"))
ax.set_title("牛頓法求解")ax.set_xticks([-1,0,1,2])fig.tight_layout()plt.show()print('總的迭代次數為%d'%n)

                                             作者對原始碼進行了改進

運行結果

總的迭代次數為4(由於我們之前已經畫圖大概確定了它的解範圍,因此迭代效率總體來說還是很高的)

相關焦點

  • 科學計算庫之Scipy
    Scipy包含的功能有最優化、線性代數、積分、插值、擬合、特殊函數、快速傅立葉變換、信號處理和圖像處理、常微分方程求解和其他科學與工程中常用的計算,而這些功能都是我們在之後進行數據分析需要的。下面是一些常用的Scipy的子模塊。
  • 高級的科學計算庫——Scipy
    optimizeimport numpy as npdef f(x): return x**2 + 20 * np.sin(x)ans = optimize.fsolve(f, -4)print(ans)print(f(ans))結果為[-2.75294663][1.687539e-14]求解非線性方程組
  • Scipy使用簡介
    物理常量常用單位special函數庫非線性方程組求解最小二乘擬合計算函數局域最小值計算全域最小值解線性方程組最小二乘解特徵值和特徵向量連續概率分布離散概率分布核密度函數二項分布,泊松分布,伽馬分布 import special as Sprint(S.gamma(4))6.0擬合與優化-optimizeoptimize模塊提供了許多數值優化算法,這裡主要對其中的非線性方程組求解、數值擬合和函數最小值進行介紹非線性方程組求解
  • Python數據分析常見庫介紹之Scipy
    Scipy包含的功能有最優化、線性代數、積分、插值、擬合、特殊函數、快速傅立葉變換、信號處理和圖像處理、常微分方程求解和其他科學與工程中常用的計算,而這些功能都是我們在之後進行數據分析需要的。下面是一些常用的Scipy的子模塊。
  • 【收藏】萬字解析Scipy的使用技巧!
    物理常量常用單位special函數庫非線性方程組求解最小二乘擬合計算函數局域最小值計算全域最小值解線性方程組最小二乘解特徵值和特徵向量連續概率分布離散概率分布核密度函數二項分布,泊松分布,伽馬分布 import special as Sprint(S.gamma(4))6.0擬合與優化-optimizeoptimize模塊提供了許多數值優化算法,這裡主要對其中的非線性方程組求解、數值擬合和函數最小值進行介紹非線性方程組求解
  • AI 基礎:Scipy(科學計算庫) 簡易入門
    Scipy是由針對特定任務的子模塊組成:模塊名應用領域scipy.cluster向量計算/Kmeansscipy.constants物理和數學常量scipy.fftpack傅立葉變換scipy.integrate積分程序scipy.interpolate插值scipy.io數據輸入輸出scipy.linalg線性代數程序scipy.ndimagen維圖像包scipy.odr正交距離回歸
  • 【Python基礎】科學計算庫Scipy簡易入門
    Scipy是由針對特定任務的子模塊組成:模塊名應用領域scipy.cluster向量計算/Kmeansscipy.constants物理和數學常量scipy.fftpack傅立葉變換scipy.integrate積分程序scipy.interpolate插值scipy.io數據輸入輸出scipy.linalg線性代數程序scipy.ndimagen維圖像包scipy.odr正交距離回歸
  • 科學計算庫Scipy簡易入門
    Scipy是由針對特定任務的子模塊組成:模塊名應用領域scipy.cluster向量計算/Kmeansscipy.constants物理和數學常量scipy.fftpack傅立葉變換scipy.integrate積分程序scipy.interpolate插值scipy.io數據輸入輸出scipy.linalg線性代數程序scipy.ndimagen維圖像包scipy.odr正交距離回歸
  • 「§5.2求解二元一次方程組(二)」教學設計
    「§5.2求解二元一次方程組(二)」教學設計文•孫道斌 一、教材分析 本節課內容節選自北師大版《義務教育教科書•數學》八年級上冊第5章第二節第2課時,是在學生學習了代入消元法解二元一次方程組的基礎上,繼續學習的另一種消元方法——加減消元,它是學生系統學習二元一次方程組知識的前提和基礎.用加減消元法解二元一次方程組,決定消去哪一個未知數是關鍵.對於複雜的二元一次方程組一定要先化簡
  • 量子計算機成功求解線性方程組
    最新發現與創新  科技日報合肥6月9日電(記者吳長鋒)記者今天從中國科學技術大學獲悉,由該校潘建偉院士領銜的量子光學和量子信息團隊的陸朝陽、劉乃樂研究小組,在國際上首次成功實現用量子計算機求解線性方程組的實驗。該研究成果發表在6月7日出版的《物理評論快報》上。
  • 2018考研數學抽象線性方程組求解問題
    今天小編就針對2017考研數學中抽象線性方程組的求解問題,為大家進行詳細的解答,幫助2018年的考研學子把握複習備考的命題方向!   一、2017考研數學對於線性方程組的考試要求   2017考研數學對於線性方程組的考試要求是:   1.會用Cramer法則;   2.理解齊次線性方程組有非零解的充分必要條件及非齊次線性方程組有解的充分必要條件;   3.理解齊次線性方程組的基礎解系及通解的概念
  • 中國科學家實現量子計算機求解線性方程組—新聞—科學網
  • 北師大版八年級上5.2 求解二元一次方程組
    2、加減。將變形後的兩個方程相加,或者相減,消去一個未知數。得到一個一元一次次方程。3、求解。解這個新得到的一元一次方程,求得這個未知數的值。4、回代。把這個求得的未知數的值,代入原方程組中的任意一個方程,求出另外一個未知數的值。5、做結論。把求得的兩個未知數的解,用大括號聯立起來,這就是原方程組的解。
  • 2019考研數學:淺析高斯消元法如何求解線性方程組
    線性方程組是線性代數的核心考點之一,命題率比較高。線性方程組求解的基本方法就是高斯消元法。今天我們就給大家簡單講解如何利用高斯消元法求解線性方程組的解。首先,我們先來了解一下線性方程組和高斯消元法的相關概念。
  • 優化 | 利用SciPy求解非線性規劃問題
    編者按:本文使用SciPy的optimize模塊來求解非線性規劃問題,結合實際例子,引入非線性規劃問題的求解算法及相應函數的調用。# Importing Modulesfrom scipy import optimizeimport matplotlib.pyplot as pltimport numpy as npimport sympy
  • [人民日報]我科學家實現用量子計算機求解線性方程組
    為世界首次,可用於高準確度的氣象預報等 本報北京6月8日電  (記者喻思孌)近日,由中國科學技術大學潘建偉院士領銜的量子光學和量子信息團隊的陸朝陽、劉乃樂研究小組,在國際上首次成功實現了用量子計算機求解線性方程組的實驗。
  • C語言求解線性方程組
    經典問題用高斯約當算法求解線性方程組。這裡要求對任意形式的線性方程組都能夠妥善處理,不能只適用於方程個數和未知量數目相等的特殊情形。然後根據線性代數中線性方程組的解的情況及判別準則判斷方程是否有解,有多少個解。當線性方程組有解時,需要用convert函數將其轉換為簡化行階梯型矩陣,然後輸出唯一解或一般解 C語言代碼如下:
  • 中國實現線性方程組量子計算機求解 國際領先
    中國科學技術大學潘建偉院士領銜的量子光學和量子信息團隊的陸朝陽、劉乃樂研究小組,在國際上首次成功實現用量子計算機求解線性方程組的實驗。該研究成果發表在《物理評論快報》上。線性方程組廣泛地應用於幾乎每一個科學和工程領域,包括數值計算、信號處理、經濟學和計算機科學等。比如與我們日常生活緊密相關的氣象預報,就需要建立並求解包含百萬變量的線性方程組,來實現對大氣中各種物理參數(溫度、氣壓、溼度等)的模擬和預測。而高準確度的氣象預報則需要求解具有海量數據的方程組,假使要求解一個億億億變量的方程組,即便是用現在世界上最快的超級計算機也至少需要幾百年。
  • 利用逆矩陣法求解方程組的APOS分析
    (2)在矩陣逆層內對於3.1和3.2的的結果,第一個原因是2×2的矩陣的行列式3.1項為零,所以許多參與者能夠得出這樣的結論:逆並不存在,而無需應用公式的所有步驟。第二個原因是作為普通數學老師,他們經常只教關於2×2矩陣而不是關於3×3矩陣的行列式、矩陣逆和方程組的解的概念。
  • 初識Scipy
    Demo:from scipy import io as spioimport numpy as npa = np.ones((3,3))spio.savemat('d:/scipy/file.mat',mdict={'a':a})#讀取二進位文件data = spio.loadmat('d:/scipy/