lua-example

lua example


更新記錄

item note
20160810 第一版

目錄


Lua

  • 範例來源:lua-5.1.5/test

ex1.如何取得參數

範例說明

  • #
    取得array szie
  • arg[]
    可以取得輸入參數值
1
2
3
4
5
6
#!/usr/bin/env lua
-- echo command line arguments

for i=0,#arg do
print(i,arg[i])
end

測試

1
2
3
4
5
# ./echo.lua  t1 t2 t3
0 ./echo.lua
1 t1
2 t2
3 t3

ex2.數值分析 bisection example

  • Interval halving (Bisection) Revisited (半區間法) , 迭代法
  • 直接法利用固定次數的步驟求出問題的解 (直接解方程式)
  • 迭代法是通過從一個初始估計出發尋找一系列近似解來解決問題的數學過程 (只能求得問題的近似解,所找到的一系列近似解會收敛到問題的精確解)

  • f(x) = 3XXX -24
    f(a) = -24, f(b)= 57

a b c f(c)
0 3 1.5 -13.875
1.5 3 2.25 10.17..
1.5 2.25 1.875 -4.22..
1.875 2.25 2.0625 2.32..
  • 計算到目前為止,問題的解是界於1.875及2.0625之間,若繼續往下算,可以得到更精確的答案

  • f(X1) * f(X2) < 0 , 表示在代1根在{X1,X2}區間

    [Bisection]
  • 程式流程如下

    [Bisection]

範例程式

  • io.write
    Equivalent to io.output():write(···).

  • math.abs (x)
    Returns the absolute value of x.

  • string.format (formatstring, ···)
    The format string follows the same rules as the ISO C function sprintf.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ cat bisect.lua 
#!/usr/bin/env lua
-- bisection method for solving non-linear equations

delta=1e-6 -- tolerance

function bisect(f,a,b,fa,fb)
local c=(a+b)/2
io.write(n," c=",c," a=",a," b=",b,"\n")
if c==a or c==b or math.abs(a-b)<delta then return c,b-a end
n=n+1
local fc=f(c)
if fa*fc<0 then return bisect(f,a,c,fa,fc) else return bisect(f,c,b,fc,fb) end
end

-- find root of f in the inverval [a,b]. needs f(a)*f(b)<0
function solve(f,a,b)
n=0
local z,e=bisect(f,a,b,f(a),f(b))
io.write(string.format("after %d steps, root is %.17g with error %.1e, f=%.1e\n",n,z,e,f(z)))
end

-- our function
function f(x)
return x*x*x-x-1
end

-- find zero in [1,2]
solve(f,1,2)

測試

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# ./bisect.lua 
0 c=1.5 a=1 b=2
1 c=1.25 a=1 b=1.5
2 c=1.375 a=1.25 b=1.5
3 c=1.3125 a=1.25 b=1.375
4 c=1.34375 a=1.3125 b=1.375
5 c=1.328125 a=1.3125 b=1.34375
6 c=1.3203125 a=1.3125 b=1.328125
7 c=1.32421875 a=1.3203125 b=1.328125
8 c=1.326171875 a=1.32421875 b=1.328125
9 c=1.3251953125 a=1.32421875 b=1.326171875
10 c=1.32470703125 a=1.32421875 b=1.3251953125
11 c=1.324951171875 a=1.32470703125 b=1.3251953125
12 c=1.3248291015625 a=1.32470703125 b=1.324951171875
13 c=1.3247680664062 a=1.32470703125 b=1.3248291015625
14 c=1.3247375488281 a=1.32470703125 b=1.3247680664062
15 c=1.3247222900391 a=1.32470703125 b=1.3247375488281
16 c=1.3247146606445 a=1.32470703125 b=1.3247222900391
17 c=1.3247184753418 a=1.3247146606445 b=1.3247222900391
18 c=1.3247165679932 a=1.3247146606445 b=1.3247184753418
19 c=1.3247175216675 a=1.3247165679932 b=1.3247184753418
20 c=1.3247179985046 a=1.3247175216675 b=1.3247184753418
after 20 steps, root is 1.3247179985046387 with error 9.5e-07, f=1.8e-07

ex3. 溫度轉換 Celsius(C) to Fahrenheit(F)

  • 華氏度(Fahrenheit)

    • 在标准大气压下,冰的熔点为32℉,水的沸点为212℉,中间有180等分,每等分为华氏1度
    • 20世纪后期,全球绝大多数国家开始向国际单位制转换,使用摄氏温标替代了华氏温标
      美国支持保留华氏温标的人提出的一个重要理由是它使用较方便。与摄氏温标相比,华氏温标的一度要比摄氏温标小,当都精确到整数时,华氏温标比摄氏温标准确
      华氏温标的0度比摄氏温标0度要低,在表达常用温度时,通常可以避免负数的使用
  • 攝氏度(Celsius)

    • ℃,degree celcius
    • 在标准大气压,纯水的凝固点(即固液共存的温度)為0℃,水的沸點為100℃,中間劃分為100等份,每等份為1℃。

範例程式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for c0=-20,50-1,10 do
io.write("C ")
for c=c0,c0+10-1 do
io.write(string.format("%3.0f ",c))
end
io.write("\n")

io.write("F ")
for c=c0,c0+10-1 do
f=(9/5)*c+32
io.write(string.format("%3.0f ",f))
end
io.write("\n\n")
end

測試

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
C -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 
F -4 -2 -0 1 3 5 7 9 10 12

C -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
F 14 16 18 19 21 23 25 27 28 30

C 0 1 2 3 4 5 6 7 8 9
F 32 34 36 37 39 41 43 45 46 48

C 10 11 12 13 14 15 16 17 18 19
F 50 52 54 55 57 59 61 63 64 66

C 20 21 22 23 24 25 26 27 28 29
F 68 70 72 73 75 77 79 81 82 84

C 30 31 32 33 34 35 36 37 38 39
F 86 88 90 91 93 95 97 99 100 102

C 40 41 42 43 44 45 46 47 48 49
F 104 106 108 109 111 113 115 117 118 120

參考來源