tft每日頭條

 > 科技

 > python程序設計第七章課後答案

python程序設計第七章課後答案

科技 更新时间:2025-01-03 01:09:08

python程序設計第七章課後答案?在最後一章,我們蔣學習解微積分問題首先學習數學函數,接下來對Python标準庫和Sympy中的常用數學函數進行快速描述然後,我們将學習如何求解函數極限、計算導數和積分,這些都是你在微積分課上學到的内容直接進入正題,現在小編就來說說關于python程序設計第七章課後答案?下面内容希望能幫助到你,我們來一起看看吧!

python程序設計第七章課後答案(Python數學編程第七章)1

python程序設計第七章課後答案

在最後一章,我們蔣學習解微積分問題。首先學習數學函數,接下來對Python标準庫和Sympy中的常用數學函數進行快速描述。然後,我們将學習如何求解函數極限、計算導數和積分,這些都是你在微積分課上學到的内容。直接進入正題。

7.1 什麼是函數?

首先從一些基本的定義開始。函數是輸入集合和輸出集合之間的映射(mapping),函數的特殊條件在于輸入集合的一個元素隻與輸出集合的一個元素相對應。例如,圖7-1展示了兩個集合,輸出集合的元素是輸入集合元素的平方。

使用熟悉的函數符号,我們把這個函數記為,此處x是自變量。因此f(2) = 4,f(100) = 10000,以此類推。我們将x稱為自變量是因為我們可以自由地假設它的值,隻要這個值在x的定義域中(我們将在下一個小結介紹定義域)。

函數也可以由多個變量定義。例如定義了一個由x和y兩個變量組成的函數。

7.1.1 函數的定義域和值域

函數的定義域(domain)是指自變量的有效輸入值的集合,值域(range)是指函數的輸出集合。

例如,函數f(x) = \frac{1}x{}的定義域是所有的非零實數和複數,因為\frac{1}{0}沒有意義。将定義域中的每一個值代入\frac{1}{x}後得到的結果所構成的集合就是值域,在本例中仍然是所有的非零實數和複數。


注:函數的定義域和值域也可以是不同的。例如,當函數x^2的定義域是所有的正數和負數時,其值域僅僅是正數。


7.1.2 常用數學函數概述

我們已經使用了一些來自于Python标準庫的math模塊常用的數學函數。常見的例子如sin()和cos()函數,它們分别是正弦三角函數和餘弦三角函數。還有其他三角函數(如tan())和這些函數的反函數(如arcsin(),arccos(),acrtan())。

math模塊也包含計算一個屬的對數的函數:自然對數函數log()、以2為底的對數函數log2()和以10為底的對數函數log10(),以及計算e^x值的函數exp(),此處e是歐拉函數(近似等于2.71828)。

這些函數都有一個缺點:他們不适于符号表達式。如果我們要對包含符号的數學表達式進行運算,就不得不定義在Sympy中的類似函數。

來看一個簡單中的例子:


>>> import math >>> math.sin(math.pi/2) 1.0


這裡我們使用标準庫的math模塊中定義的sin()函數計算角度\pi/2的正弦值。我們也可以用Sympy做同樣的事情。


>>> import sympy >>> sympy.sin(math.pi/2) 1.00000000000000


與标準庫中的sin()函數類似,Sympy的sin()函數需要輸入的角度是弧度的形式。上面的兩個函數返回的結果都是1。

現在,我們嘗試輸入符号來調用每個函數,并觀察結果:


>>> from sympy import Symbol >>> theta = Symbol('theta') >>> math.sin(theta) math.sin(theta) # ① Traceback (most recent call last): File "<pyshell#7>", line 1, in <module> math.sin(theta) math.sin(theta) File "C:\Users\32645\AppData\Roaming\Python\Python36\site-packages\sympy\core\expr.py", line 359, in __float__ raise TypeError("can't convert expression to float") TypeError: can't convert expression to float >>> sympy.sin(theta) sympy.sin(theta) # ② 2*sin(theta)


當在①處使用輸入參數theta 調用标準庫中的sin()函 數時,該函數無法工作,所以它引發了一個異常并提示輸入參數應該是一個數值。另外,在②處,SymPy 可以進行相同的運算,并返回表達式2* sin(theta)。現在對我們來說這并不奇怪,但是它展示了标準庫中的數學函數不能完成的任務類型。 考慮另一個例子,假設我們想推導一個物體在抛物運動中達到最高點所需的時間表達式,假設該物體以角度theta和初始速度u抛射(見2.4節)。 在最高點處,u*sin(theta)-g*t= 0,為解出t,我們用學習過的solve()函數:


>>> from sympy import sin, solve, Symbol >>> u = Symbol('u') >>> t = Symbol('t') >>> g = Symbol('g') >>> theta = Symbol('theta') >>> solve(u*sin(theta)-g*t,t) [u*sin(theta)/g]


如同之前所學,t的表達式為u*sin(theta)/g,這個例子也演示了如何使用solve()函數求解包含數學函數的方程。

7.2 Sympy中的假設

在之前的程序裡,我們在Sympy中創建了一個Symbol對象,用來定義類似x = Symbol('x')這樣的變量。假設你要求Sympy執行一個運算并給出結果,比如判斷表達式x 5是否大于0,看一下會發生什麼:


>>> from sympy import Symbol >>> x = Symbol('x') >>> if (x 5) > 0: print('Do Something') else: print('DoSomething else') Traceback (most recent call last): File "<pyshell#21>", line 1, in <module> if (x 5) > 0: File "C:\Users\32645\AppData\Roaming\Python\Python36\site-packages\sympy\core\relational.py", line 398, in __bool__ raise TypeError("cannot determine truth value of Relational") TypeError: cannot determine truth value of Relational


因為Sympy沒有任何關于x的正負信息,所以它不能推斷出x 5是否大于0,因此它輸出錯誤提示。但基礎數學運算告訴我們,如果x是正數,那麼x 5始終是大于0的,如果x是負數,x 5将隻在某些情況下是正數。

因此,如果創建一個Symbol對象,并指定positive=True,我們是在告訴SymPyx隻取正值。現在它明确x 5必定是大于0的:


>>> x = Symbol('x', positive=True) >>> if (x 5) > 0: print('Do Something') else: print('do Something else') Do Something


注意,如果我們指定negative=True,我們将得到與第一種情形相同的錯誤提示。如同我們聲明一個符号是正值或者負值一樣,我們也可以聲明它是實數、整數、複數、虛數等,在StmPy中這些聲明被稱為假設。

7.3 計算函數極限

微積分的一個常見任務就是在自變量趨于一個确定值時,求函數的極限值(或簡稱極限)。考慮函數,其圖像如圖7-2所示。

圖7-2

由圖中可知,随着x值的增大,函數f(x)的值趨于0,用極限符号可以記為:

我們可以通過如下Limit類的對象在Sympy中計算函數極限:


>>> from sympy import Limit, Symbol, S # ① >>> x = Symbol('x') # ② >>> Limit(1/x,x,S.Infinity) # ③ Limit(1/x, x, oo, dir='-')


在①處,我們導入Limit和Symbol類,以及S(一個特殊的Sympy類,其中包含正負無窮和其他特殊值的含義)。在②處,我們創建一個Symbol對象x來指代自變量x。我們在③處創建Limit對象,并傳遞三個參數:1/x、變量x和要計算函數極限的x的值(正無窮,即S.Infinity)。

返回的結果是一個未計算對象,其中符号oo表示正無窮,dir='-'表示從負方向趨于極限。

為計算極限值,我們使用doit()函數:


>>> l = Limit(1/x, x, S.Infinity) >>> l.doit() 0


默認情況下,我們從正方向計算極限,除非要計算的x的值是正無窮或負無窮。在x是正無窮的情況下,方向是負的,而在x是負無窮的情況下,方向是正的。可以按照如下方式改變默認的方向:


>>> Limit(1/x, x, 0, dir='-').doit() -oo


現在我們計算

當x從負方向趨于0時,極限值趨于負無窮。反過來,如果從正方向趨于0,則極限值趨于正無窮:


>>> Limit(1/x, x, 0, dir=' ').doit() oo


Limit類也可以在自動處理具有不确定形式的極限的函數:


>>> from sympy import Symbol, sin >>> Limit(sin(x)/x, x, 0).doit() 1


我們可能會使用洛必達法則來計算這類函數的極限,但在這裡的代碼,Limit可以很好的處理這類極限。

7.3.1 連續複利

假設你在銀行存了1美元,這筆存款成為本金,他可以為你帶來利息。在這裡,假設全部利息在一年内計算複利n次,在一年結束時你将得到的總額為:

著名數學家James Bernoulli發現,随着n值的增大,趨于e的值,這是一個我們可以通過計算函數極限來驗證的常熟:


>>> from sympy import Limit, Symbol, S >>> n = Symbol('n') >>> Limit((1 1/n)**n, n, S.Infinity).doit() E


在給定本金金額p、利率r和年數t的情況下,可以通過以下公式計算複利:

假設是連續複利,我們可以得到如下關于A的表達式:


>>> from sympy import Symbol, Limit, S >>> p = Symbol('p', positive=True) >>> r = Symbol('r', positive=True) >>> t = Symbol('t', positive=True) >>> Limit(p*(1 r/n)**(n*t), n, S.Infinity).doit() p*exp(r*t)


我們創建了三個Symbol對象,分别代表本金金額p、利率r和年數t。在創建Symbol對象時,我們通過設置關鍵字參數possitive=True來指定這些變量隻取正值。如果不這麼設定,SymPy沒有任何關于符号所指代的數值的信息,從而可能無法正确計算極限值。然後,我們用複利的表達式創建Limit對象,并使用doit()函數對其進行計算。計算的極限結果是p*exp(r*t), 它告訴我們,對于固定利率,複利随時間呈指數增長。

7.3.2 瞬時變化率

假設路上有一輛行駛的汽車,它正在均勻加速,其行駛的距離S由以下函數給出:

在這個函數中,自變量是t,它表示汽車已經行駛的時間。

如果我們知道汽車在時間和之間行駛的距離,那麼我們可以通過表達式計算汽車在一個單位時間内行駛的距離。這個式子也被稱為函數S(t)關于變量t的平均比變化率,或稱為平均速率。如果将寫成,其中是和之間的單位時間差,我們可以把平均速率的表達式改寫為

這個表達式也是變量t_1的函數。現在我們進一步假設\delta_t非常小,并讓它趨向于0,我們可以用極限符号來表示這個式子,具體如下:

現在我們來計算上述極限。首先,讓我們你來創建有關的表達式對象:


>>> from sympy import Symbol, Limit >>> t = Symbol('t') >>> St = 5*t**2 2*t 8 # ① >>> t1 = Symbol('t1') >>> delta_t = Symbol('delta_t') >>> St1 = St.subs({t:t1}) # ② >>> St1_delta = St.subs({t:t1 delta_t}) # ③


在①處,定義函數S(t),接着定義兩個符号t1和,分别對應于t1和δ,然後使用subs()函數,分别在②和③處将S(t)中的t替換為t1和來得到和。現在可以計算極限了:


>>> Limit((St1_delta - St1) / delta_t, delta_t, 0).doit() 10*t1 2


極限值是10*t1 2,即S(t)在時間t1時的變化率,或瞬時變化率,這個變化率 經常被稱為汽車在時間t1的瞬時速率。 我們在這裡計算的極限稱為函數的導數,也可以用SymPy的Derivative類直接計算極限。

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved