Categories
Mathematica

สมการชูสามนิ้ว

เห็นน้องๆสร้างสมการคณิตศาสตร์กันเป็นรูปมือกันผมเลยลองเล่นบ้าง เป็นรูปมือชู 3 นิ้ว (พระพุทธ พระธรรม พระสงฆ์ หรือเปล่า ?)

สมการที่ผมหามาได้มีหน้าตาตามนี้ครับ *มีคนถามมาว่าหามายังไง เดี๋ยว​มาอธิบายให้ครับหลักๆก็อาศัย Fourier series และภาพต้นฉบับก็เอามาจากเวบ https://www.123rf.com/stock-photo/three_finger.html?sti=lei4tdvr1lskwqekk0| ครับ

h3Function[
  t_] := {((30359/31 - 1/17 Sin[23/15 - 16 t] - 
        4/43 Sin[55/36 - 12 t] - 6/23 Sin[29/19 - 9 t] - 
        13/36 Sin[36/23 - 8 t] - 20/31 Sin[39/25 - 6 t] - 
        33/43 Sin[31/20 - 5 t] - 3091/309 Sin[36/23 - 2 t] - 
        92/29 Sin[36/23 - t] + 27/40 Sin[69/44 + 3 t] + 
        9/44 Sin[29/18 + 4 t] + 8/19 Sin[68/43 + 7 t] + 
        2/35 Sin[164/35 + 10 t] + 4/21 Sin[59/37 + 11 t] + 
        1/78 Sin[151/101 + 13 t] + 4/47 Sin[70/43 + 14 t] + 
        2/29 Sin[55/34 + 15 t] + 2/19 Sin[53/33 + 17 t] + 
        2/27 Sin[18/11 + 18 t] + 1/25 Sin[43/27 + 19 t] + 
        1/31 Sin[41/25 + 20 t] + 2/23 Sin[73/45 + 21 t] + 
        1/52 Sin[45/26 + 22 t] + 1/24 Sin[115/72 + 23 t] + 
        1/29 Sin[49/29 + 24 t] + 2/39 Sin[57/35 + 25 t] + 
        1/81 Sin[37/22 + 26 t] + 1/27 Sin[28/17 + 27 t] + 
        1/49 Sin[77/46 + 28 t] + 1/36 Sin[18/11 + 29 t] + 
        1/131 Sin[33/19 + 30 t] + 1/36 Sin[118/71 + 31 t] + 
        1/95 Sin[37/22 + 32 t] + 1/58 Sin[18/11 + 33 t] + 
        1/148 Sin[85/48 + 34 t] + 1/51 Sin[29/18 + 35 t] + 
        1/223 Sin[50/27 + 36 t] + 1/73 Sin[44/27 + 37 t] + 
        1/183 Sin[66/37 + 38 t] + 1/68 Sin[49/30 + 39 t] + 
        1/373 Sin[44/23 + 40 t] + 1/82 Sin[50/31 + 41 t] + 
        1/222 Sin[19/11 + 42 t]) UnitStep[
       15 \[Pi] - t] UnitStep[-11 \[Pi] + t] + (82913/46 - 
        6/31 Sin[12/25 - 34 t] - 2/17 Sin[45/31 - 28 t] - 
        2/7 Sin[21/16 - 26 t] - 15/22 Sin[26/35 - 17 t] - 
        97/39 Sin[69/44 - 9 t] - 116/31 Sin[19/39 - 8 t] - 
        281/108 Sin[57/41 - 7 t] - 138/31 Sin[20/53 - 6 t] - 
        864/23 Sin[31/21 - 2 t] + 13015/73 Sin[39/17 + t] + 
        2183/38 Sin[231/68 + 3 t] + 473/59 Sin[118/47 + 4 t] + 
        253/35 Sin[53/15 + 5 t] + 88/63 Sin[142/41 + 10 t] + 
        39/77 Sin[103/38 + 11 t] + 61/33 Sin[107/33 + 12 t] + 
        32/23 Sin[17/9 + 13 t] + 2/23 Sin[54/25 + 14 t] + 
        5/16 Sin[451/450 + 15 t] + 5/11 Sin[6/53 + 16 t] + 
        9/29 Sin[37/9 + 18 t] + 3/16 Sin[173/38 + 19 t] + 
        3/7 Sin[198/61 + 20 t] + 8/21 Sin[37/15 + 21 t] + 
        7/26 Sin[59/33 + 22 t] + 7/31 Sin[57/65 + 23 t] + 
        1/6 Sin[14/29 + 24 t] + 9/34 Sin[5/16 + 25 t] + 
        3/32 Sin[445/99 + 27 t] + 13/66 Sin[131/34 + 29 t] + 
        7/29 Sin[103/40 + 30 t] + 3/31 Sin[100/99 + 31 t] + 
        2/41 Sin[37/16 + 32 t] + 3/20 Sin[13/28 + 33 t] + 
        9/50 Sin[23/5 + 35 t] + 2/23 Sin[105/23 + 36 t] + 
        3/28 Sin[310/67 + 37 t] + 2/15 Sin[143/45 + 38 t] + 
        4/33 Sin[48/29 + 39 t] + 1/20 Sin[34/57 + 40 t] + 
        1/32 Sin[125/43 + 41 t] + 3/37 Sin[49/44 + 42 t]) UnitStep[
       11 \[Pi] - t] UnitStep[-7 \[Pi] + t] + (28702/23 - 
        4/39 Sin[33/23 - 42 t] - 53/37 Sin[51/76 - 40 t] - 
        4/21 Sin[26/43 - 38 t] - 77/37 Sin[7/25 - 33 t] - 
        5/41 Sin[77/58 - 32 t] - 106/77 Sin[20/19 - 29 t] - 
        71/19 Sin[23/24 - 27 t] - 97/42 Sin[3/28 - 26 t] - 
        127/17 Sin[11/26 - 20 t] - 42/19 Sin[10/71 - 19 t] - 
        142/31 Sin[49/45 - 17 t] - 465/29 Sin[23/20 - 14 t] - 
        418/37 Sin[1/14 - 13 t] - 51/25 Sin[37/29 - 12 t] - 
        365/53 Sin[34/27 - 9 t] - 6795/137 Sin[19/36 - 7 t] - 
        241/16 Sin[11/28 - 6 t] - 5584/29 Sin[19/39 - 2 t] + 
        21149/52 Sin[49/11 + t] + 1701/17 Sin[29/35 + 3 t] + 
        862/35 Sin[26/9 + 4 t] + 667/28 Sin[92/25 + 5 t] + 
        577/78 Sin[79/44 + 8 t] + 193/18 Sin[1/27 + 10 t] + 
        178/27 Sin[71/19 + 11 t] + 359/57 Sin[34/33 + 15 t] + 
        135/38 Sin[91/24 + 16 t] + 91/44 Sin[111/31 + 18 t] + 
        160/29 Sin[118/27 + 21 t] + 84/29 Sin[9/40 + 22 t] + 
        52/19 Sin[114/37 + 23 t] + 113/46 Sin[161/36 + 24 t] + 
        10/33 Sin[2977/744 + 25 t] + 27/16 Sin[37/11 + 28 t] + 
        39/20 Sin[77/31 + 30 t] + 7/9 Sin[51/13 + 31 t] + 
        47/34 Sin[145/31 + 34 t] + 14/29 Sin[86/39 + 35 t] + 
        29/28 Sin[532/145 + 36 t] + 37/28 Sin[80/43 + 37 t] + 
        3/16 Sin[10/13 + 39 t] + 5/26 Sin[35/17 + 41 t]) UnitStep[
       7 \[Pi] - t] UnitStep[-3 \[Pi] + t] + (40485/29 - 
        255/23 Sin[2/21 - 23 t] - 1023/40 Sin[25/16 - 16 t] - 
        148/11 Sin[47/31 - 15 t] - 1781/43 Sin[27/34 - 10 t] - 
        9508/15 Sin[48/37 - t] + 3391/22 Sin[17/25 + 2 t] + 
        2003/35 Sin[22/19 + 3 t] + 3390/61 Sin[89/21 + 4 t] + 
        3313/25 Sin[82/27 + 5 t] + 671/8 Sin[70/41 + 6 t] + 
        574/13 Sin[58/35 + 7 t] + 1293/16 Sin[78/67 + 8 t] + 
        1462/37 Sin[17/21 + 9 t] + 727/32 Sin[96/23 + 11 t] + 
        1747/37 Sin[367/100 + 12 t] + 68/3 Sin[45/91 + 13 t] + 
        1063/31 Sin[41/35 + 14 t] + 54/11 Sin[55/16 + 17 t] + 
        165/8 Sin[224/225 + 18 t] + 135/38 Sin[1/18 + 19 t] + 
        583/63 Sin[113/24 + 20 t] + 205/23 Sin[220/73 + 21 t] + 
        461/33 Sin[7/18 + 22 t] + 53/5 Sin[99/23 + 24 t] + 
        102/25 Sin[82/47 + 25 t] + 63/11 Sin[31/16 + 26 t] + 
        224/27 Sin[117/25 + 27 t] + 121/16 Sin[58/33 + 28 t] + 
        49/9 Sin[21/17 + 29 t] + 107/50 Sin[3/7 + 30 t] + 
        38/9 Sin[139/34 + 31 t] + 55/23 Sin[46/19 + 32 t] + 
        136/39 Sin[44/29 + 33 t] + 13/7 Sin[14/39 + 34 t] + 
        11/3 Sin[26/15 + 35 t] + 285/89 Sin[118/29 + 36 t] + 
        28/19 Sin[13/17 + 37 t] + 53/35 Sin[89/34 + 38 t] + 
        18/19 Sin[114/47 + 39 t] + 39/44 Sin[9/13 + 40 t] + 
        16/29 Sin[185/52 + 41 t] + 69/26 Sin[56/33 + 42 t]) UnitStep[
       3 \[Pi] - t] UnitStep[\[Pi] + t]) UnitStep[Sqrt[
    Sign[Sin[t/
      2]]]], ((-(248369/91) - 1/102 Sin[127/85 - 28 t] - 
        1/31 Sin[59/38 - 18 t] - 1/110 Sin[71/47 - 12 t] - 
        11/28 Sin[57/37 - 5 t] - 3/5 Sin[69/44 - 4 t] - 
        903/139 Sin[36/23 - 2 t] - 773/119 Sin[47/30 - t] + 
        55/23 Sin[41/26 + 3 t] + 9/64 Sin[57/35 + 6 t] + 
        13/23 Sin[65/41 + 7 t] + 1/21 Sin[71/42 + 8 t] + 
        17/37 Sin[27/17 + 9 t] + 18/47 Sin[29/18 + 10 t] + 
        11/40 Sin[51/32 + 11 t] + 5/19 Sin[53/33 + 13 t] + 
        3/16 Sin[21/13 + 14 t] + 3/35 Sin[71/44 + 15 t] + 
        6/37 Sin[47/29 + 16 t] + 2/9 Sin[21/13 + 17 t] + 
        1/19 Sin[139/87 + 19 t] + 1/13 Sin[41/25 + 20 t] + 
        1/113 Sin[37/24 + 21 t] + 1/231 Sin[55/29 + 22 t] + 
        1/12 Sin[34/21 + 23 t] + 1/213 Sin[119/27 + 24 t] + 
        1/199 Sin[41/29 + 25 t] + 1/131 Sin[71/41 + 26 t] + 
        1/57 Sin[28/17 + 27 t] + 1/45 Sin[57/35 + 29 t] + 
        1/98 Sin[22/13 + 30 t] + 1/69 Sin[28/17 + 31 t] + 
        1/836 Sin[91/20 + 32 t] + 1/53 Sin[18/11 + 33 t] + 
        1/246 Sin[64/35 + 34 t] + 1/79 Sin[51/32 + 35 t] + 
        1/126 Sin[44/25 + 36 t] + 1/54 Sin[18/11 + 37 t] + 
        1/306 Sin[65/34 + 38 t] + 1/66 Sin[18/11 + 39 t] + 
        1/171 Sin[97/54 + 40 t] + 1/80 Sin[77/47 + 41 t] + 
        1/212 Sin[79/45 + 42 t]) UnitStep[
       15 \[Pi] - t] UnitStep[-11 \[Pi] + t] + (-(27062/15) - 
        1/21 Sin[49/39 - 42 t] - 1/12 Sin[29/68 - 36 t] - 
        3/22 Sin[12/19 - 33 t] - 2/33 Sin[16/21 - 30 t] - 
        1/15 Sin[2/19 - 27 t] - 3/35 Sin[1/325 - 24 t] - 
        9/20 Sin[58/37 - 19 t] - 30/89 Sin[59/42 - 16 t] - 
        13/24 Sin[22/19 - 13 t] - 16/21 Sin[32/25 - 10 t] + 
        7171/19 Sin[48/29 + t] + 118/5 Sin[39/14 + 2 t] + 
        8283/202 Sin[49/32 + 3 t] + 276/31 Sin[149/36 + 4 t] + 
        245/19 Sin[71/32 + 5 t] + 116/55 Sin[39/22 + 6 t] + 
        8/13 Sin[68/41 + 7 t] + 51/35 Sin[61/19 + 8 t] + 
        13/14 Sin[29/37 + 9 t] + 35/61 Sin[83/25 + 11 t] + 
        19/22 Sin[37/35 + 12 t] + 14/23 Sin[41/18 + 14 t] + 
        13/30 Sin[10/19 + 15 t] + 7/34 Sin[20/7 + 17 t] + 
        13/38 Sin[4/47 + 18 t] + 13/42 Sin[115/41 + 20 t] + 
        13/40 Sin[25/63 + 21 t] + 5/31 Sin[108/25 + 22 t] + 
        17/67 Sin[103/69 + 23 t] + 2/37 Sin[142/33 + 25 t] + 
        2/23 Sin[72/25 + 26 t] + 5/32 Sin[203/53 + 28 t] + 
        3/22 Sin[29/14 + 29 t] + 3/25 Sin[116/37 + 31 t] + 
        6/41 Sin[20/19 + 32 t] + 1/12 Sin[105/31 + 34 t] + 
        3/29 Sin[28/23 + 35 t] + 3/34 Sin[239/60 + 37 t] + 
        4/33 Sin[67/36 + 38 t] + 2/27 Sin[4/31 + 39 t] + 
        2/41 Sin[35/12 + 40 t] + 2/19 Sin[11/17 + 41 t]) UnitStep[
       11 \[Pi] - t] UnitStep[-7 \[Pi] + t] + (-(256299/275) - 
        7/16 Sin[4/35 - 40 t] - 31/29 Sin[7/22 - 39 t] - 
        16/31 Sin[7/22 - 34 t] - 28/23 Sin[29/32 - 33 t] - 
        34/19 Sin[27/26 - 31 t] - 47/25 Sin[21/37 - 27 t] - 
        183/64 Sin[13/15 - 26 t] - 697/209 Sin[13/16 - 20 t] - 
        103/27 Sin[22/51 - 19 t] - 41/42 Sin[4/23 - 15 t] - 
        271/53 Sin[3/43 - 14 t] - 207/38 Sin[59/60 - 13 t] - 
        286/23 Sin[22/27 - 11 t] - 517/54 Sin[33/65 - 8 t] - 
        171/22 Sin[13/30 - 7 t] - 7885/34 Sin[22/59 - t] + 
        8146/43 Sin[28/27 + 2 t] + 10347/22 Sin[28/13 + 3 t] + 
        7433/38 Sin[11/38 + 4 t] + 3353/72 Sin[37/20 + 5 t] + 
        331/46 Sin[170/37 + 6 t] + 1573/131 Sin[37/27 + 9 t] + 
        1999/41 Sin[63/40 + 10 t] + 173/31 Sin[35/32 + 12 t] + 
        656/101 Sin[49/29 + 16 t] + 437/32 Sin[23/22 + 17 t] + 
        114/23 Sin[4 + 18 t] + 71/20 Sin[3/22 + 21 t] + 
        84/37 Sin[69/32 + 22 t] + 143/43 Sin[61/35 + 23 t] + 
        231/68 Sin[5/22 + 24 t] + 92/55 Sin[112/33 + 25 t] + 
        3/2 Sin[1/7 + 28 t] + 41/18 Sin[55/27 + 29 t] + 
        59/46 Sin[153/76 + 30 t] + 16/35 Sin[1/10 + 32 t] + 
        26/77 Sin[8/33 + 35 t] + 50/41 Sin[45/23 + 36 t] + 
        13/25 Sin[8/3 + 37 t] + 40/37 Sin[346/77 + 38 t] + 
        7/34 Sin[37/30 + 41 t] + 1/3 Sin[46/15 + 42 t]) UnitStep[
       7 \[Pi] - t] UnitStep[-3 \[Pi] + t] + (-(43691/25) - 
        108/35 Sin[30/29 - 40 t] - 118/43 Sin[29/22 - 39 t] - 
        89/25 Sin[6/17 - 35 t] - 278/101 Sin[11/37 - 32 t] - 
        89/24 Sin[11/36 - 30 t] - 338/49 Sin[93/94 - 26 t] - 
        155/14 Sin[1/19 - 23 t] - 520/27 Sin[25/34 - 18 t] - 
        3729/233 Sin[15/13 - 17 t] - 1935/22 Sin[59/38 - 13 t] - 
        1624/33 Sin[31/23 - 9 t] - 299/12 Sin[26/43 - 6 t] - 
        8789/23 Sin[36/37 - 4 t] - 794/7 Sin[15/41 - 3 t] - 
        19163/23 Sin[43/36 - 2 t] + 24528/29 Sin[97/30 + t] + 
        2255/24 Sin[144/37 + 5 t] + 29915/277 Sin[233/58 + 7 t] + 
        1494/35 Sin[71/95 + 8 t] + 991/22 Sin[65/14 + 10 t] + 
        3579/61 Sin[31/27 + 11 t] + 537/32 Sin[106/57 + 12 t] + 
        463/42 Sin[18/55 + 14 t] + 1027/29 Sin[31/35 + 15 t] + 
        362/17 Sin[46/13 + 16 t] + 88/27 Sin[131/28 + 19 t] + 
        91/37 Sin[173/39 + 20 t] + 374/29 Sin[48/25 + 21 t] + 
        253/24 Sin[155/33 + 22 t] + 227/33 Sin[1/608 + 24 t] + 
        75/37 Sin[49/30 + 25 t] + 242/23 Sin[249/56 + 27 t] + 
        133/18 Sin[7/5 + 28 t] + 54/25 Sin[1/358 + 29 t] + 
        49/31 Sin[109/28 + 31 t] + 50/33 Sin[1/22 + 33 t] + 
        7/5 Sin[40/43 + 34 t] + 214/55 Sin[89/24 + 36 t] + 
        241/43 Sin[12/25 + 37 t] + 20/13 Sin[280/279 + 38 t] + 
        105/79 Sin[53/19 + 41 t] + 87/26 Sin[65/37 + 42 t]) UnitStep[
       3 \[Pi] - t] UnitStep[\[Pi] + t]) UnitStep[Sqrt[
    Sign[Sin[t/2]]]]}

ทดลอง plot

Categories
IT Uncategorized

computer scientists vs computational scientists

ไปเจอมา ขำดี แต่มันก็จริงนะครับ 555

Computational scientists solve tomorrow’s problems with yesterday’s computers; computer scientists seem to do it the other way around.

– anonymous

Categories
R

a simple pendulum in R

เป็นตัวอย่างที่ผมเขียนขึ้นตอนใช้สอนการเขียน function ในภาษา R ครับ

library(magick)
# the formula for the changing of angle over time 
# https://en.wikipedia.org/wiki/Pendulum
theta <- function(t,period,theta0){
  theta0*cos(2*pi*t/period)
}

# for drawing the pendulum at a given point (x,y), i.e. drawing a line between (0,0) and (x,y)
draw.pendulum <- function(pen.x, pen.y){
  
  pivot.x <- 0
  pivot.y <- 0

  plot(x=pivot.x,y=pivot.y,type = 'l',ylim = c(-1.5,0.1),asp = 1)
  lines(x=c(pivot.x,pen.x),y=c(pivot.y,pen.y))
  points(x = pen.x, y=pen.y,col='red')
}

# calculate the position of the pendulum over time
# l-length of the pendulum
# theta0 - the starting angle (in radian)
# runtime - the simulation time (in seconds)
# step - time step
pendulum <- function(theta0,l,runtime,step = 0.1){
  g <- 9.8
  period <- 2*pi*sqrt(l/g)
  
  times <- seq(0.0,runtime, by = step)

  pen.x <- l*sin(theta(times, period = period,theta0 = theta0)) 
  pen.y <- -l*cos(theta(times,period = period,theta0 = theta0))
  
  output <- matrix(c(times,pen.x,pen.y),ncol = 3)
  return(output)
}


pendulum.sim <- function(theta0, l, runtime, step = 0.1){
  
  sim.data <- pendulum(theta0 = theta0, l=l, runtime = runtime)
  
  ## export each frame as png
  for(i in 1:nrow(sim.data)){
    png(filename = paste0(tempdir(),"/",i,".png"))
    draw.pendulum(sim.data[i,2],sim.data[i,3])
    dev.off()
  }
  
  frames <- image_read(paste0(tempdir(),"/",1:nrow(sim.data),".png"))
  animate <- image_animate(image = frames, fps = 1/step)
  
  return(animate)
  
}

animate <- pendulum.sim(theta0 = pi/4, l = 1, runtime = 10)
print(animate)
Categories
Mathematica

Protected: แยกไข่พยาธิด้วย Neural Network

This content is password protected. To view it please enter your password below:

Categories
Mathematica

OpenCL ในภาษา Wolfram

มีคนถามมาว่าช่วยทำตัวอย่างให้ดูหน่อยในการใช้ OpenCL ใน Mathematica ซึ่งผมก็บอกไปแล้วว่ามันตัวอย่างเยอะเลยในhelp Mathematica เอง 🙂 แต่ก็ยังอยากให้ผมทำให้ดู ตัวอย่างที่ทำให้ดูก็เป็นการประมาณค่า Pi โดยอาศัยที่เรียกว่า Monte carlo โดยประมาณจากการสุ่มจุดลงในสี่เหลี่ยมจัตุรัสที่มีวงกลมรัศมีครึ่งหนึ่งของความยาวด้านสี่เหลี่ยมจัตุรัส แล้วดูว่ามีกี่จุดที่อยู่ในวงกลม ซึ่งค่า Pi จะสามรถประมาณได้จาก

Pi = 4 * จำนวนจุดในวงกลม / จำนวนจุดที่สุ่มมาทั้งหมด

อันนี้เป็น code ที่ผมเขียนโดยใช้ OpenCL ใน Mathematica เพื่อหาดูว่าจุดไหนบ้างที่อยู่ในวงกลมซึ่งมีจุดศูนย์กลาง (0.5,0.5) ในสี่เหลี่ยนจัตุรัส

<< OpenCLLink`

scr = "
  __kernel void myPie( __global double *X, __global double *Y, 
__global mint *inC, mint np) {
      int indx = get_global_id(0);
      double d; //distance
  	if (indx < np) {
  		d = sqrt((X[indx]-0.5)*(X[indx]-0.5)+(Y[indx]-0.5)*(Y[indx]-0.5));
          if(d <= 0.5)
inC[indx] = 1;   
  	}
  }
  ";

fn = OpenCLFunctionLoad[scr, 
  "myPie", {{_Real, _, "Input"}, {_Real, _, "Input"}, {_Integer, _, 
    "Output"}, _Integer}, 16 ];

np = 10^6;
x = OpenCLMemoryLoad[RandomReal[1, np]];
y = OpenCLMemoryLoad[RandomReal[1, np]];
inc = OpenCLMemoryLoad[ConstantArray[0, np]];
Print["my Pi : ", (OpenCLMemoryGet@(fn[x, y, inc, np] // First) // 
    Total)*4.0/np]

OpenCLMemoryUnload[x, y, inc]

ทดลองรันดูสัก 100 ครั้ง โดยที่แต่ล่ะครั้งสุ่มมา 10^7 จุด แล้วดูว่ามันให้ค่าประมาณแตกต่างเท่าไหร่เมื่อเทียบกับค่าจริง (จาก Mathematica) จากรูปด้านล่าง เส้นประสีดำคือที่ได้จากการประมาณ สีแดงคือเส้นค่า Pi จาก Mathematica

ส่วนอีกอันก็เป็นการหมุนภาพ โดยที่มีจุดหมุนอยู่ที่กลางภาพครับ

scr = "
  __kernel void test1( __global float * mat1, __global float * mat2, 
float theta, mint width, mint height) {
      int xIndex = get_global_id(0);
  	int yIndex = get_global_id(1);
  	int indx = xIndex + yIndex*width;
  
  	 if (xIndex >= width || yIndex >= height)
  		return ;
  
  	//image centre
  	float x0 = width/2;
  	float y0 = height/2;
  
  	//relative position
  	int xprime = xIndex-x0;
  	int yprime = yIndex-y0;
  
  	float sinTheta = sin(theta);
  	float cosTheta = cos(theta);
  
  	int nx =(xprime*cosTheta - yprime*sinTheta + x0);
  	int ny =(xprime*sinTheta + yprime*cosTheta + y0);
  	mat2[indx] = mat1[nx + width*ny];
  }
  
  ";

Clear[test];
test = OpenCLFunctionLoad[scr, 
  "test1", {{"Float", _, "Input"}, {"Float", _, "Output"}, 
   "Float", _Integer, _Integer}, {16, 16}, 
  "ShellOutputFunction" -> Print];
Categories
Mathematica Uncategorized

ว่าด้วยเรื่อง Paclets ของภาษา Wolfram

เพิ่งอัพเดท Mathematica ไปใช้ 12.1 แล้วเจอเรื่อง paclet ที่เปลี่ยนไป (ในทางที่ดีขึ้น) เลยเดี๋ยวจะมาเล่าให้ฟัง ขอแปะแหล่งข้อมูลไว้ก่อน

1. https://www.wolframcloud.com/obj/tgayley/Published/PacletDevelopment.nb

2. https://www.wolfram.com/broadcast/video.php?sx=paclet&v=2833

3. https://reference.wolfram.com/language/guide/Paclets.html

Categories
Mathematica

เว้นวรรค

มีคนส่งมาถามว่ามีข้อความเป็นภาษาอังกฤษแต่อยากให้เว้นวรรคหรือใส่space ให้หน่อยถ้ามันขึ้นต้นด้วยตัวพิมพ์ใหญ่ เช่น “AasdfasfdAsdfasd” อยากให้มันเป็น “Aasdfasfd Asdfasd” ผมเขียน script ง่ายให้ดังนี้ครับ

AddSpace[str_] := (StringReplace[str, x_?UpperCaseQ :> ” ” <> x ] // StringTrim)

ซึ่งเป็นภาษา Wolfram ครับ

อันนี้เอามาลองกับชื่อจังหวัดที่พิมพ์ติดกันมา

ที่อยากจะเน้นคือเรื่อง pattern ในภาษา Wolfram นี่มีประโยชน์มาก ทำให้เราทำงานได้เร็วขึ้นครับ

Categories
Mathematica

แบบจำลองการเพิ่มขึ้นของเชื้อมาลาเรียในคน

กำลังเตรียมdraft งานเก่าที่ทำมาหลายปีแล้วไม่ได้มีโอกาสส่งตีพิมพ์สักที เลยเอามาปัดฝุ่นใหม่โดยใช้ Mathematica รู้สึกได้เลยว่า code มันเขียนไม่กี่บรรทัดเอง แถมแชร์ก็ง่าย https://www.wolframcloud.com/obj/sompob/Published/NJW_Im4a.nb

Categories
Mathematica

มันจะกระจายยังไงถ้าไม่ทำอะไรเลย

ทำเล่นๆขำ ว่าถ้าไวรัสที่ว่ามันกระจายไปตามจังหวัดต่างๆที่ว่า จำนวนคนติดเชื้อมันพุ่งเยอะขนาดไหน แบบว่าถ้าคนมันคิดว่าเป็นหวัดธรรมดา

โห … ตัวเลขพุ่งขึ้นเร็วมากกก ถ้าเห็นโมเดลทำนายเรื่องอะไรก็ตามอยากให้คิดกันเสมอว่า

“All models are wrong, but some are useful”

ฉะนั้นอย่าเพิ่งไปเชื่ออะไรง่ายๆครับ ทุกโมเดลมันมีสมมุติฐานในการสร้างของมัน ระบบในธรรมชาติมันซับซ้อนมากครับ ไม่มีใครที่จะโมเดลมันได้หมดหรอกครับ ทุกโมเดลมันจะตัดความยุ่งยาก ซับซ้อนออกเพื่อให้โมเดลได้ง่ายครับ

Categories
R Uncategorized

มาลองใช้ Stan แก้ปัญหา

พอดีว่าง ระหว่างรอผลคำนวณอะไรบางอย่าง ผมเห็นมีคนโพสท์ถามที่เวบพันทิปตามนี้ครับ

จากคำถามนี้เราสามารถที่จะใช้ Stan แก้ปัญหาได้ถ้าผมมองว่าการวัดเปรียบเทียบเครื่องมือมาตรฐาน(จริง)กับที่ปรับปรุงขึ้นมานั้นในแต่ล่ะครั้งนั้นไม่ได้เกี่ยวกันเลย และค่าจากวัดของเครื่องที่ปรับปรุงนั้นมีการกระจายรอบค่าจากเครื่องมาตราฐานแบบ normal distribution โดยมีค่า standard deviation หรือ SD อยู่ค่าหนึ่งที่เป็นตัวกำหนดประสิทธิภาพของเครื่อง อย่างเช่น จากข้อมูลที่ให้มาเมื่อวัดเทียบกับเครื่องมือจริงที่วัดได้ 2 แต่ค่าจากเครื่องปรับปรุงวัดมา 3 ครั้งได้ (1.8,2.1,1.9) เราจะสมมุติให้ทั้ง 3 ค่านี้กระจายรอบค่าใดค่าหนึ่ง โดยที่ ถ้าเราปรับปรุงได้เจ๋ง ค่าที่มันกระจายรอบนี้มันก็ควรจะได้เท่ากับค่าจากเครื่องจริงโดยที่มีค่า SD น้อยที่สุดเท่าที่จะเป็นไปได้ แต่ในความเป็นจริงก็จะมีผลผันผวนหรือerrorต่างๆเข้ามาเกี่ยวข้อง ที่ผมจะทำให้ดูนี้เราจะลองใช้โปรแกรมอย่าง Stan มาช่วยหาดูว่าค่ากลางที่เครื่องปรับปรุงหรือสร้างขึ้นมานั้นมันกระจายรอบในแต่ล่ะครั้งของการวัดมันคือค่าอะไรและมี SD เท่าใด

ผมใช้โปรแกรมที่ชื่อ Stan ในภาษา R ผ่าน library ที่เรียกว่า rstan ครับ ด้านล่างนี้ก็เป็น code ที่ผมใช้กับปัญหานี้ครับ

#โหลด library ที่จะใช้งานครับ 
#ในที่นี้มี 2 ตัวคือ rstan กับ bayesplot (ใช้วาดกราฟสรุปผล)
library(rstan)
library(bayesplot)

#เตรียมข้อมูล โดยผมแยกตามค่าของเครื่องจริง
data <- list(
  ob2 = c(1.8,2.1,1.9),
  ob3 = c(3.2,3.0,3.2),
  ob4 = c(3.9,4.3,4.4),
  ob5 = c(5.0, 5.2, 5.5),
  ob6 = c(6.1,5.9,6.5),
  n=3
)

# code ของโมเดล
model <- "
data{
      //จำแหนกประเภทของตัวแปรของข้อมูล ว่าเป็นเลขจำนวนเต็มหรือทศนิยม พร้อมกำหนดขนาด
        int<lower=1> n; 
	real ob2[n];
	real ob3[n];
	real ob4[n];
	real ob5[n];
	real ob6[n];
}
parameters{
// กำหนดประเภทของตัวแปรที่จะใช้ในโมเดล ซึ่งในที่นี้คือค่ากลางที่ข้อมูลมันกระจายรอบ ซึ่งแบ่งตามค่าจริง
// sig เป็นค่า SD 
	real ob2mu;
	real ob3mu;
	real ob4mu;
	real ob5mu;
	real ob6mu;
	real<lower=0> sig;
}
model{
//กำหนดว่าค่ากลางมันและSD อยู่ในช่วงไหน จากการกระจายแบบไหน 
//ซึ่งในที่นี้ผมให้มันมาจาก uniform distribution โดยใส่ช่วงที่คิดว่าค่ามันจะอยู่ในนั้น
	sig ~ uniform(0,3);
	ob2mu ~ uniform(0,7);
	ob3mu ~ uniform(0,7);
	ob4mu ~ uniform(0,7);
	ob5mu ~ uniform(0,7);
	ob6mu ~ uniform(0,7);

// กำหนดให้ค่าที่วัดมาในแต่ล่ะค่าจริงกระจายแบบ normal รอบค่ากลางอันหนึ่ง
	ob2 ~ normal(ob2mu, sig);
	ob3 ~ normal(ob3mu, sig);
	ob4 ~ normal(ob4mu, sig);
	ob5 ~ normal(ob5mu, sig);
	ob6 ~ normal(ob6mu, sig);
 
}
"
fit <- stan(model_code=model, data = data, iter = 10000)

ผลลัพท์ที่ได้ก็จะประมาณนี้ครับ

เห็นได้ว่าค่ากลางหรือ median ที่ 50% นั้นค่อนข้างจะใกล้กับค่าจริงคือ เช่นที่ค่าจริง = 2 เครื่องปรับปรุงทำได้ 1.93(95%CI: (1.63,2.24)) หรือที่ 6 เครื่องปรับปรุงทำได้ที่ 6.15 (CI: (5.86,6.48)) และ SD = 0.25 CI: (0.17-0.44)

posterior <- as.matrix(fit)
plot_title <- ggtitle("Posterior distributions",
                      "with medians and 95% intervals")
mcmc_areas(posterior,
           pars = c("ob2mu","ob3mu","ob4mu","ob5mu","ob6mu", "sig" ),
           prob = 0.95) + plot_title
ตัวอย่างการกระจายของค่าที่ได้
posterior2 <- extract(fit, inc_warmup = T, permuted = FALSE)

color_scheme_set("mix-blue-pink")
p <- mcmc_trace(posterior2,  pars = c("ob2mu","ob3mu","ob4mu","ob5mu","ob6mu", "sig" ), 
                n_warmup = 5000,
                facet_args = list(nrow = 6, labeller = label_parsed))
p + facet_text(size = 15)

จากกราฟการกระจายที่ได้จะเห็นได้ว่าผมใส่เป็น uniform distribution ที่ช่วงระหว่าง 0-7 เลยแต่ผลลัพท์ที่ได้เป็น normal distribution ครับ

chains ของแต่ล่ะตัวแปร