Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //module lab1
- open System
- open System.Net
- open System.IO
- open System.Collections.Specialized
- // почтовый адрес
- let email = "ol5478@yandex.ru"
- // общий тип для возвращаемых вашими функциями значений, где первая часть кортежа это само значение функции, вторая - кол-во операций
- type Result = float * int
- let delta = 1e-10
- // *** Первая часть
- let pi = 3.14
- let fTailor x : float = (0.25)*(x*x - pi*pi/3.0) // функция, которую раскладываем
- let n, a, b = 20., pi/5., pi // интервал
- let cube n = n*n
- let rec minus n =
- match n with
- | 0 -> 1.
- | 1 -> -1.
- | _ -> minus (n - 2)
- let tailor x : Result =
- let rec tailor' n =
- let monom = (Math.Pow (-1.0, float(n)))*(Math.Cos (x*float(n)))/float(cube n)
- if abs(monom) <= delta then
- (0., n)
- else
- let (res, iter) = tailor' (n + 1)
- (monom + res, iter)
- tailor' 1
- let tailorA x : Result =
- let rec tailorA' acc monom i =
- let monom2 = - monom / (Math.Cos x * float(i - 1)) * float(cube i-1) * (Math.Cos x * float(i)) / float (cube i)
- if abs(monom2) <= delta then
- (acc, i)
- else
- tailorA' (acc + monom2) monom2 (i + 1)
- if x <= delta then
- x, 1
- else
- tailorA' (-Math.Cos x) (-Math.Cos x) 2
- let printTailor () =
- [a .. (b-a)/n .. b]
- |> List.map (fun x -> let (firstRes, firstCou), (secondRes, secondCou) = tailor x, tailorA x in (x, firstRes, firstCou, secondRes, secondCou, fTailor x))
- |> 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 )
- // *** Вторая часть
- let fSolve1 = fun x -> Math.Exp(x) - Math.Exp(x) - 2. // функция, решение которой ищем
- let a1, b1 = 0., 1.
- let fSolve2 = fun x -> Math.Sin(Math.Log(x)) - Math.Sin(Math.Log(x)) + 2.*(Math.Log(x))
- let a2, b2 = 1., 3.
- let fSolve3 = fun x -> x - 2. + Math.Sin(1./ x)
- let a3, b3 = 1.2, 2.
- let iter f a b : Result =
- let x0 = (a + b) / 2.
- let f' = (f(x0 + delta) - f(x0)) / delta
- let phi = fun x -> x - f(x) / f'
- let rec iterA i phi x0 =
- let x = phi(x0)
- if abs (x - x0) <= delta then
- (x, i)
- else
- iterA (i + 1) phi x
- iterA 0 phi x0
- let newton f a b : Result =
- let x0 = (a + b) / 2.
- let rec newtonA i f x0 =
- let x = x0 - (f(x0) * delta) / (f(x0 + delta) - f(x0))
- if abs (x - x0) <= delta then
- (x, i)
- else
- newtonA (i + 1) f x
- newtonA 0 f x0
- let dichotomy =
- // для функций с аккумулятором удобно ставить его в начало
- let rec dichotomyA i (f:float->float) (a:float) (b:float) : Result =
- let t = (a + b) / 2.
- if b - a <= delta then
- (t, i)
- else
- if f(t) * f(a) < 0. then
- dichotomyA (i + 1) f a t
- else
- dichotomyA (i + 1) f t b
- dichotomyA 0 // чтобы воспользоваться каррированием
- let printSolve () =
- [(fSolve1, a1, b1); (fSolve2, a2, b2); (fSolve3, a3, b3)]
- |> List.iter (fun (fSolve, a, b) ->
- [iter; newton; dichotomy]
- |> List.map (fun f -> f fSolve a b)
- |> List.iter (fun (res, cou) -> printfn "%f\t%d" res cou)
- printfn ""
- )
- let main () =
- let values = new NameValueCollection()
- values.Add("email", email)
- values.Add("content", File.ReadAllText(__SOURCE_DIRECTORY__ + @"/" + __SOURCE_FILE__))
- let client = new WebClient()
- let response = client.UploadValues(new Uri("http://mipt.eu01.aws.af.cm/lab1"), values)
- let responseString = Text.Encoding.Default.GetString(response)
- printf "%A\n" responseString
- main();;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement