Advertisement
Guest User

Untitled

a guest
Apr 16th, 2015
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 3.90 KB | None | 0 0
  1. //module lab1
  2.  
  3. open System
  4. open System.Net
  5. open System.IO
  6. open System.Collections.Specialized
  7.  
  8. // почтовый адрес
  9. let email = "ol5478@yandex.ru"
  10. // общий тип для возвращаемых вашими функциями значений, где первая часть кортежа это само значение функции, вторая - кол-во операций
  11. type Result = float * int
  12. let delta = 1e-10
  13.  
  14. // *** Первая часть
  15.  
  16. let pi = 3.14
  17. let fTailor x : float = (0.25)*(x*x - pi*pi/3.0) // функция, которую раскладываем
  18. let n, a, b = 20., pi/5., pi // интервал
  19.  
  20. let cube n = n*n
  21.  
  22. let rec minus n =
  23.     match n with
  24.     | 0 -> 1.
  25.     | 1 -> -1.
  26.     | _ -> minus (n - 2)
  27.  
  28. let tailor x : Result =
  29.     let rec tailor' n =
  30.        let monom = (Math.Pow (-1.0, float(n)))*(Math.Cos (x*float(n)))/float(cube n)
  31.        if abs(monom) <= delta then
  32.            (0., n)
  33.        else
  34.            let (res, iter) = tailor' (n + 1)
  35.             (monom + res, iter)
  36.     tailor' 1
  37.  
  38. let tailorA x : Result =
  39.    let rec tailorA' acc monom i =
  40.         let monom2 = - monom / (Math.Cos x * float(i - 1)) * float(cube i-1) * (Math.Cos x * float(i)) / float (cube i)
  41.         if abs(monom2) <= delta then
  42.             (acc, i)
  43.         else
  44.             tailorA' (acc + monom2) monom2 (i + 1)
  45.    if x <= delta then
  46.        x, 1
  47.    else
  48.        tailorA' (-Math.Cos x) (-Math.Cos x) 2
  49.  
  50. let printTailor () =
  51.     [a .. (b-a)/n .. b]
  52.     |> List.map (fun x -> let (firstRes, firstCou), (secondRes, secondCou) = tailor x, tailorA x in (x, firstRes, firstCou, secondRes, secondCou, fTailor x))
  53.     |> List.iter (fun (a,b,c,d,e,f) -> printf "%f\t%f\t%d\t%f\t%d\t%f\n" a b c d e f )
  54.  
  55. // *** Вторая часть
  56.  
  57. let fSolve1 = fun x -> Math.Exp(x) - Math.Exp(x) - 2.  // функция, решение которой ищем
  58. let a1, b1 = 0., 1.
  59. let fSolve2 = fun x -> Math.Sin(Math.Log(x)) - Math.Sin(Math.Log(x)) + 2.*(Math.Log(x))
  60. let a2, b2 = 1., 3.
  61. let fSolve3 = fun x -> x - 2. + Math.Sin(1./ x)
  62. let a3, b3 = 1.2, 2.
  63.  
  64. let iter f a b : Result =
  65.     let x0 = (a + b) / 2.
  66.     let f' = (f(x0 + delta) - f(x0)) / delta
  67.    let phi = fun x -> x - f(x) / f'
  68.     let rec iterA i phi x0 =
  69.         let x = phi(x0)
  70.         if abs (x - x0) <= delta then
  71.             (x, i)
  72.         else
  73.             iterA (i + 1) phi x
  74.     iterA 0 phi x0
  75.  
  76. let newton f a b : Result =
  77.     let x0 = (a + b) / 2.
  78.     let rec newtonA i f x0 =
  79.         let x = x0 - (f(x0) * delta) / (f(x0 + delta) - f(x0))
  80.         if abs (x - x0) <= delta then
  81.             (x, i)
  82.         else
  83.             newtonA (i + 1) f x
  84.     newtonA 0 f x0
  85.  
  86. let dichotomy =
  87.     // для функций с аккумулятором удобно ставить его в начало
  88.     let rec dichotomyA i (f:float->float) (a:float) (b:float) : Result =
  89.         let t = (a + b) / 2.
  90.         if b - a <= delta then
  91.             (t, i)
  92.         else
  93.             if f(t) * f(a) < 0. then
  94.                 dichotomyA (i + 1) f a t
  95.             else
  96.                 dichotomyA (i + 1) f t b
  97.     dichotomyA 0 // чтобы воспользоваться каррированием
  98.  
  99.    
  100. let printSolve () =
  101.     [(fSolve1, a1, b1); (fSolve2, a2, b2); (fSolve3, a3, b3)]
  102.     |> List.iter (fun (fSolve, a, b) ->
  103.         [iter; newton; dichotomy]
  104.         |> List.map (fun f -> f fSolve a b)
  105.         |> List.iter (fun (res, cou) -> printfn "%f\t%d" res cou)
  106.         printfn ""
  107.     )
  108.  
  109. let main () =
  110.   let values = new NameValueCollection()
  111.   values.Add("email", email)
  112.   values.Add("content", File.ReadAllText(__SOURCE_DIRECTORY__ + @"/" + __SOURCE_FILE__))
  113.  
  114.   let client = new WebClient()
  115.   let response = client.UploadValues(new Uri("http://mipt.eu01.aws.af.cm/lab1"), values)
  116.   let responseString = Text.Encoding.Default.GetString(response)
  117.  
  118.   printf "%A\n" responseString
  119.  
  120. main();;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement