程式設計的科學/時光流逝
在 CME 的第 8 章中,SPT 討論了牛頓如何使用變數上的一個點來表示微分,而萊布尼茨則使用了本書中的符號:. 萊布尼茨符號的優點是,它明確說明了在進行微分時應考慮哪個自變數(如果有多個自變數)。[1]
例如,如果
那麼
另一方面,關於 t 而不是 x 進行微分得到
因為 被視為相對於自變數 t 的常數。也就是說,無論你改變 t 的值多少, 的值都不會改變(因為你沒有改變 x,只是 t)。
到目前為止,我們一直在假設,自變數和我們求導的變數是同一個。
讓我們研究一下如果我們不做出這樣的假設,我們的程式碼可能是什麼樣子。
根據我們對術語構造器的視覺化,我們一直假設自變數是 x,因為我們最終得到了像這樣的視覺化
3x^2
如果我們不硬編碼自變數,我們將需要將其傳遞進來。以下是 term 的一個版本框架,其中自變數的名稱將被傳遞進來
function term(a,iv,n)
{
function value(x) { ... }
function toString() { ... }
function diff(wrtv) { ... }
this;
}
新版 term 和舊版 term 之間的第一個主要區別在於,新版 term 有三個形式引數,而不是兩個。第二個形式引數 iv(代表independent variable,即自變數),表示自變數。我們假設它將繫結到諸如 x、t 等符號。我們可以在基本 toString 方法(沒有簡化的那個)中看到這一點,它從
function toString() { "" + a + "x^" + n; }
變為
function toString() { "" + a + iv + "^" + n; }
注意,原始版本中的 x 是字串的一部分,因此是固定的。在第二個版本中,iv 是一個變數,它被(或更確切地說將被)繫結到一個符號。看一下視覺化將有助於我們理清思路
var t = term(5,:w,3);
sway> t . toString();
STRING: 5w^3
第二個主要變化是,微分方法 diff 現在接受一個引數 wrtv,它代表with-respect-to variable(即關於哪個變數微分)。如果自變數和關於哪個變數微分的變數相同,則微分將像以前一樣進行。如果不相同,則會生成一個常數零
function diff(wrtv)
{
if (wrtv == iv)
{
if(n == 0,term(0,iv,0),term(a * n,iv,n - 1));
}
else
{
constant(0);
}
}
現在讓我們測試一下
var a = t . diff(:w); //iv and wrtv match
var b = t . diff(:x); //iv and wrtv do not match
sway> t . toString();
STRING: 5w^3
sway> a . toString();
STRING: 15w^2
sway> b . toString();
STRING: 0
此輸出假設 term 的 toString 方法執行了上一章中討論的簡化。
我們不需要更改術語的 value 方法。這是因為使用了自變數的值,而不是它的名稱。換句話說,value 方法執行數值計算,而 diff 方法執行符號計算。因此,value 需要一個數字,而 diff 需要一個名稱。
由於 toString 和 diff 都使用術語變數的名稱而不是值,因此它們都需要修改,因為名稱不再是硬編碼的。
1. 如果我們將形式引數 iv 重新命名為 x 並且將所有 iv 的出現替換為 x 會發生什麼?解釋一下。
2. 重新定義簡化的 term 構造器,使其不再假設自變數是 x。
3. 重新定義簡化的 sum 構造器,使其不再假設自變數是 x。
4. 完成樸素的微分系統(minus、times 和 div)。
5. 使用 sway 做 p. 92 上的 2。
6. 使用 sway 做 p. 92 上的 4 和 5。
7. 我們正在玩一個把沙包扔進垃圾桶的遊戲,我們想正確地模擬物理現象。水平位移為 ,垂直位移為 。x 和 z 關於 t 的變化是什麼?令 ,,,並且 。繪製 x 和 z 以及 x 和 z 方向上的速度與時間的關係圖,時間範圍為 0 到 10。
- ↑ 正如 SPT 指出的那樣,點符號是在假設關於時間 t 進行微分的情況下使用的。因此,本章的名稱。