程式設計的科學/一點點這樣,一點點那樣
在上一章中,您被介紹了變數的概念。變數是計算機記憶體中一個可以儲存值的位置
sway> var x = 1000000; INTEGER: 1000000 sway> x; INTEGER: 1000000
這裡,我將該位置命名為x,並在該位置儲存了數字1000000。一旦我預留了該位置,我就可以透過為變數賦值新值來更改那裡的值。這是一個例子
sway> x = 42; INTEGER: 42 sway> x; INTEGER: 42
請注意,我這次沒有使用單詞var這次。當我使用var時,表示為我預留一個新的位置。當我未使用var時,表示更新之前預留的位置。
要了解有關賦值的更多資訊,請參閱Sway 賦值。
如果我們嘗試在不首先預留位置的情況下更新位置會發生什麼?
sway> y = 3; EVALUATION ERROR: :assignError stdin,line 3: assignment: variable y is undefined
我們收到一條訊息,指出y未定義。這是直譯器告訴我們忘記使用var為y預留位置的方式。Sway 知道我們沒有定義變數,因為它在當前環境中查詢它,如果失敗,則在上下文環境中查詢,如果失敗,則在上下文的上下文中查詢,依此類推,直到它用完要查詢的位置。
變數一詞暗示值可以變化,這正是我們對x所做的;我們改變了它的值。在某些程式語言中,存在名為常量的類似的野獸,一旦建立,您就無法更改它們。在 Sway 中,本身沒有常量。如果我們需要常量,我們將使用變數代替,但我們將承諾不更改變數的值。為了提醒我們不應更改其值,我們將在命名變數時使用大寫字母(主要是)
sway> var PI = 3.14159; REAL_NUMBER: 3.1415900000
做出此承諾被稱為遵循約定。請注意,變數名稱可以(並且通常應該)超過單個字母。另請注意,CME 第 3 章中的 SPT 使用字母表開頭的字母表示常量,使用字母表結尾的字母表示變數。這是一個不同的約定。
這是一個比 CME[1]中的問題稍微簡單一點的問題
+ + + + + + + + + + + + + + + +
+ +
+ +
+ + h = w/2
+ +
+ +
+ + + + + + + + + + + + + + + +
w
考慮一個寬高相關的矩形。假設我們稍微增加寬度。假設新高度仍然是新寬度的一半,高度會發生什麼變化?由於高度是根據寬度計算的,因此我們說寬度是自變數,高度是因變數。首先,讓我們定義一個函式,該函式根據寬度w給出高度h
function h(w)
{
w / 2.0;
}
請注意,當我們編寫這樣的函式時,因變數幾乎總是函式的名稱,自變數是形式引數的名稱。使用此規則來幫助您定義所需的函式。
我們可以測試一下我們的新函式
sway> h(100); REAL_NUMBER: 50.0000000
這證實了我們的猜想,如果寬度為 100 個單位,則高度必須為 50 個單位。
微積分通常關注的是給定自變數變化時因變數的變化,特別是這兩個變化的比率。
現在,讓我們使用寬度的小變化來計算上述矩形的比率
sway> var w = 100; //width sway> var dw = 0.01; //change in width sway> var dh = h(w + dw) - h(w); //change in height
高度的變化只是新高度減去舊高度。現在我們可以計算比率了
sway> dh / dw; REAL_NUMBER: 0.5000000000
微積分還關注的是,這個比率是否會隨著不同數量的變化或自變數的不同值而變化?回答這些問題的懶人方法是,您猜對了,編寫一個函式來完成這項工作。
function ratio(w,dw)
{
var dh = h(w + dw) - h(w);
dh / dw;
}
請注意,我們傳入w和dw的值,然後計算比率。這使我們能夠非常輕鬆地嘗試各種各樣的值
sway> ratio(40,0.01); REAL_NUMBER: 0.5000000000 sway> ratio(40,0.0001); REAL_NUMBER: 0.5000000000 sway> ratio(20,0.0001); REAL_NUMBER: 0.5000000000
此比率函式非常有用!我們看到的比率似乎從未改變。但是,假設我們現在開始檢視寬高之間關係不同的矩形。突然之間,我們的比率函式看起來沒那麼有用了。這是因為我們硬編碼了高度函式。[2] 我們可以透過將高度函式作為第三個引數傳入來解決此問題。現在我們可以輕鬆地嘗試新的高度函式。透過這樣做,我們使比率計算函式更通用。
function ratio(w,dw,h)
{
var dh = h(w + dw) - h(w);
dh / dw;
}
它應該以同樣的方式工作
sway> ratio(40,0.01,h); REAL_NUMBER: 0.5000000000 sway> ratio(40,0.0001,h); REAL_NUMBER: 0.5000000000 sway> ratio(20,0.0001,h); REAL_NUMBER: 0.5000000000
讓我們嘗試一個不同的高度函式
function g(w)
{
w * w;
}
使用此高度函式,高度g隨著寬度的平方而增長。比率現在會產生什麼?讓我們嘗試一個寬度和越來越小的變化
sway> ratio(100,1,g); INTEGER: 201 sway> ratio(100,0.1,g); REAL_NUMBER: 200.10000000 sway> ratio(100,0.01,g); REAL_NUMBER: 200.01000000 sway> ratio(100,0.001,g); REAL_NUMBER: 200.00100000
很明顯,如果寬度的變化變得無限小,則寬度為 100 時的比率將為 200。
現在讓我們嘗試不同的寬度和越來越小的變化
sway> ratio(200,1,g); INTEGER: 401 sway> ratio(200,0.1,g); REAL_NUMBER: 400.10000000 sway> ratio(200,0.01,g); REAL_NUMBER: 400.01000000 sway> ratio(200,0.001,g); REAL_NUMBER: 400.00100000 sway> ratio(200,0.0001,g); REAL_NUMBER: 400.00009998
對於這個新的寬度 200,比率似乎收斂於 400。此外,對於最後的測試,我們得到的值有點出乎意料。在處理實數時,這應該對您是一個警告。[3]
對於高度函式g,我們看到不同的起始寬度會產生不同的比率。大量的微積分是為了解釋為什麼這些比率會發生變化。此外,這個計算比率的過程被稱為求導數。
所有公式均使用小學算術優先順序編寫。
1. 在定義函式時,我們使用什麼變數名作為形式引數有關係嗎?
2. 繪製一個帶標籤的矩形的圖片,使高度為自變數,保持高度是寬度的一半的關係。
3. 在函式比率中,dh 由計算。如果我們假設) 等於),則dh 為或簡化為。定義一個名為ratio2的新函式來測試此假設是否有效。
4. 對於非常小的變化,哪個函式更好?為什麼?
5. 考慮一個面積永不改變的矩形。也就是說,如果寬度增加,高度會減小以進行補償,以便矩形的面積保持不變。定義一個函式,該函式根據寬度和麵積計算此矩形的高度。
6. 我們是否觀察到與函式g相同的比率行為?
7. “變化是永恆的”,但這並不意味著變化必須是恆定的。我們大多數人都習慣了恆定變化率的概念。例如,直線描述的高度與距離的變化,例如。使用比率函式來探索當x變化時y如何變化。製作一個包含y、x和dy/dx的表格。
8. 上一個問題有一個恆定的變化率。然而,因變數的變化率通常會隨著自變數的變化而變化。讓我們以正方形面積的函式為例,。首先,當x從2變到4時,面積的變化是多少?繪製此情況的草圖,標記dy和dx。當x從2變到3、2變到2.5、2變到2.1和2變到2.01時,執行相同的操作。你觀察到了什麼?嘗試相同的事情,但現在從x = 4開始。關鍵在於,面積的變化率本身取決於長度。表達y和x變化之間關係的x函式稱為導數,dy/dx。根據你的實驗,的導數是什麼?
9. 護甲的減傷率為,其中。減傷率相對於護甲和敵方等級的增長情況如何?
- ↑ 此圖使用 Cheesy ASCII (tm) Graphics(快速載入)繪製。
- ↑ 當我們將某些東西視為常數、不變的東西時,我們硬編碼它。
- ↑ 你可以相信整數,因為它們是精確的。但你永遠不應該完全相信實數,因為它們是近似值。搖擺實數的精度只有15位有效數字。