2017年7月27日 星期四

Haskell中用foldl實現foldr

假設折疊中的折疊函數是`f(x,y)`,要折疊`[1,2,3]`,初始值是`0`。
左折疊的精神如下:
`f(f(f(0 , 1) , 2) , 3)`
遞迴呼叫是發生在左邊的參數。
參數求值是從左到右的。因為一定要先遞迴到最深才能取得參數值,所以不能使用在無窮串列上。

右折疊的精神如下:
`f(1 , f(2 , f(3 , 0)))`
遞迴呼叫是發生在右邊的參數。
可以發現不用遞迴到最深就能取得參數,所以可以使用在無窮串列上。

用左折疊實現右折疊的方法就是,讓折疊函數回傳一個函數,折疊的結果是接收一個參數的函數,這樣就可以改變遞迴的位置了。

程式碼如下:
foldr' :: (b -> a -> a) -> a -> [b] -> a
foldr' f a bs = foldl (\g b x -> g (f b x)) id bs a


2017年7月24日 星期一

windows上的gvim如何設定預設字型

gvim上設定預設字型向來是一件麻煩事,尤其在windows上。
問題是參數不知道應該長怎樣,隨系統的不同而不同。

windows上,開啟gvim之前系統會執行"_vimrc"的內容。
首先用視窗界面("編輯"→"設定字型")來設定字型。
接下來利用":set guifont?"指令來觀察參數應該長怎樣。
然後在_vimrc中最後一行輸入 「 set guifont="剛剛看到的參數" 」就可以了。
我的gvim 8.0,windows 7,最後結果是這樣

set guifont=Source_Code_Pro_Medium:h12:cANSI:qDRAFT


2017年4月7日 星期五

小o符號的使用

小o符號在計算函數極限和闡述微分定義時非常的有用。對於極限理論來講,它並沒有帶來新的思想,但是符號的使用非常便利,可以造成思考上的省力效果,對於各種極限運算也可以透過小o,在形式上完全變成代數運算。小o可以說是偷渡"無窮小"的數到標準分析學裏的一個辦法。不用學習非標準分析繁重的邏輯就能夠享受非標準分析的好處。


小o的定義:
`f` 和 `g`是兩個函數,假如在某一極限過程中,`f/g rarr 0` ,就記為`f = o(g)`
,這裏的`=`,實際上是"屬於"的意思。所以`o(g)`代表的是一類的函數,我們不在乎究竟是哪一個函數,只需要知道它是那一類函數,這可以帶來很大的方便。

幾個細節:
1. 我們通常規定 `f = o(x)` 當中的極限過程是 `x rarr 0`,
`f = o((x-a)^b)` 當中的極限過程是 ` x rarr a`,所以在這種場合省略極限過程不寫。

2. `f = o(g)` 、 `f = o(|g|)`和`|f| = o(|g|)` 意思完全相同。
例如 `|f| = o(|g|) hArr |f/g| rarr 0 `
`hArr AA epsilon > 0 ,EE delta > 0 quad s.t.  ||f/g| - 0| = |f/g| < epsilon if |x| < delta` 
`hArr f/g rarr 0 hArr f = o(g)`
如果我們把 `||` 定義為歐氏空間的norm,小o符號甚至可以用在多元向量函數,
形式完全一樣。

3. `o(1)` 就是偷渡過來的無窮小。
`f = o(g) hArr f = g*o(1)`
`f rarr a hArr f = a + o(1)`,`a` 為常數。

小o如何使用:
需要加減乘除,冪指函數和複合,和泰勒展式。
泰勒展式等於是微積分的九九乘法,不記起來等於什麼題目也做不出來。

1. `o(x) +-* o(x) = o(x)`

2.  小o出現在分母怎麼辦:
`1/(a+bx+cx^2+o(x^2)) = (a+bx+cx^2+o(x^2))^-1`,用二項式定理
化成`(1+x)^-1`的形式展開。

3.  小o括弧裏面又有小o怎麼辦 :
`f=o(g)`,`g` 是 `h`的同階或更高階的無窮小,則 `f=o(h)`,因為
`f/h = f/g * g/h rarr 0 *` (有界或`0`) `= 0`
例如 `f=o(o((x-a)^2)) rArr f=o((x-a)^2)`
`f = o(ax^2 + o(x^2)) rArr f=o(x^2)`

4. 小o是指數怎麼辦:
`f^g = e^(g*ln(f))`,然後按照`e^x = 1+ x + 1/(2!) x^2 + o(x^2)`展開

5. 小o出現在根號裏面怎麼辦:
仿照2.,化成`(1+x)^alpha ` 用二項式定理展開

6.  小o在超越函數裏面怎麼辦:
用帶小o餘項的泰勒展式展開

小o用法終於講完。比小o更強的還有大O,以後再介紹。有很多高深的數學定理就是用大O寫的。

2017年1月19日 星期四

微分形式的不變性

微分的定義是這樣的
`(1)        df=f'(x)dx`
高階微分的定義
`(1a)      d^nf=f^((n))(x)dx^n`

這個式子的由來是因為我們把`dx`當成固定的,它不是`x`的函數,所以`d(dx)=0`,但是`f'(x)`是`x`的函數,因此
`d^2f=d(df)=d(f'(x)dx)=(f''(x)dx)dx+f'(x)d(dx)=f''(x)dx^2`

那麼微分形式的不變性是什麼意思呢?
假定`x`不是自變數,而是`t`的函數 :`x=varphi(t)`
那麼`df(x)`等於什麼?
我們可以按照定義
`(2)        df(x)=df(varphi(t))=f'(varphi(t))varphi'(t)dt`
或者我們可以這樣作
`(3)        df(x)=f'(x)dx=f'(varphi(t))dvarphi(t)=f'(varphi(t))varphi'(t)dt`
注意,這裡我們只是單純的把 `x=varphi(t)`代入第`(1)`式而已,這樣作居然也對,這就是微分形式的不變性。

 總結來說,我們要對一個複合函數作微分,看成是要作變數變換`x=varphi(t)`,`(2)`的作法是先代入再微分,`(3)`的作法是先微分再代入,「微分」和「代入」的次序是可交換的。但是高階微分就沒有這種性質了。其實不只一階微分,還有其他形式的微分具有微分不變性,比較進階此處暫時不提了。

帶參數積分的微分

`d/dy int_(v(y))^(u(y)) f(x,y) dx`
這式子要如何計算?
`設 int_v^u f(x,y) dx=I(u,v,y)`
`dI=(delI)/(delu) du + (delI)/(delv) dv + (delI)/(dely) dy`
`=f(u(y),y)u'(y)dy-f(v(y),y)v'(y)dy+ (int_v^u f'_y(x,y)dx) dy`
`(dI)/dy=f(u(y),y)u'(y)-f(v(y),y)v'(y)+int_v^u f'_y(x,y)dx`

證明要比這個麻煩,這樣只是方便記憶。

2017年1月14日 星期六

泰勒多項式的兩種餘項 (兼測試AsciiMath)

假設f(x)在[a, b]連續,在(a, b) n+1階可微,帶餘項的泰勒公式是這樣的:
` f(b) = sum_(k=1)^n f^((k))(a)/(k!) (b-a)^k+f^((n+1))(xi)/((n+1)!)(b-a)^(n+1) `

`f^((n+1))(xi)/((n+1)!)(b-a)^(n+1)`是最常見的餘項,叫做拉格朗日餘項。但是還有令一種餘項叫做積分餘項(還有第三種,暫時不提),這可以直接用分部積分推導,或是從拉格朗日餘項用積分中值公式推導。後一種方法簡單一點。

多加上一個條件,就是f(x)在(a, b)連續可微,就成立積分餘項
`(1/(n!))int_a^b f^((n+1))(x)(b-x)^n dx`

注意到(b-x)在 x屬於[a,b]時不變號,又發現
`(1/(n!))int_a^b (b-x)^n dx= (b-a)^(n+1)/((n+1)!)`,
之後套用積分中值公式就知道兩種餘項相等了。