Advertisement
Guest User

Untitled

a guest
Jan 16th, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.37 KB | None | 0 0
  1. let solve3 (np: normalized_polynomial) : (float * float option * float option) option =
  2. let extract p =
  3. match np with
  4. NormalizedPolynomial(p) -> p
  5. let array = extract np // applico la funzione extract al polinomio normalizzato in input
  6. let d = float(float(array.[0].N)/float(array.[0].D)) // accedo alla posizione 0 del vettore considerando 0 come il grado dell'equazione e quindi assegno a zero il coefficente del grado 0 , divido numeratore per il denominatore in modo da ottenere un numero float
  7. let c = float( float(array.[1].N)/ float(array.[1].D)) // accedo alla posizione 1 del vettore considerando 1 come il grado dell'equazione e quindi assegno a one il coefficente del grado 1 , divido numeratore per il denominatore in modo da ottenere un numero float
  8. let b = float( float(array.[2].N)/ float(array.[2].D)) // accedo alla posizione 2 del vettore considerando 2 come il grado dell'equazione e quindi assegno a two il coefficente del grado 2 , divido numeratore per il denominatore in modo da ottenere un numero float
  9. let a = float(float(array.[3].N)/ float(array.[3].D)) // accedo alla posizione 3 del vettore considerando 3 come grado dell'equazione e quindi assegno a three il coefficiente del grado 3, dividendo numeratore per denoinatore in modo da ottenere un numero float.
  10. let f = (((3.*c)/a)- ((b*b)/(a*a)))/3.
  11. let g = (((2.*(b*b*b))/(a*a*a)) - ((9.*b*c)/(a*a))+((27.*d)/a))/27.
  12. let h = ((g*g)/4.) + ((f*f*f)/27.0)
  13. if (f+g+h)=0. then // all roots are real and equal
  14. let x1 = Math.Pow(float(d/a),0.33333333333333333333333333333333)*(-1.)
  15. let x2 = Math.Pow(float(d/a),0.33333333333333333333333333333333)*(-1.)
  16. let x3 = Math.Pow(float(d/a),0.33333333333333333333333333333333)*(-1.)
  17. Some(x1,Some x2,Some x3)
  18. elif(h<=0.) then // all 3 roots are real
  19. let i = Math.Sqrt(((g*g)/4.) - h)
  20. let j = Math.Pow(i,0.33333333333333333333333333333333)
  21. let k = Math.Acos(-(g/(2.*i)))
  22. let l = j * -1.
  23. let m = Math.Cos(k/3.)
  24. let n = Math.Sqrt(3.) *Math.Sin(k/3.)
  25. let p = (b/(3.*a))* -1.
  26. let x1 = (2.*j)*Math.Cos(k/3.)-(b/(3.*a))
  27. let x2 = l * (m+n) + p
  28. let x3 = l * (m-n) + p
  29. Some(x1,Some x2,Some x3)
  30. elif(h>0.) then
  31. let r = (-1.*(g/2.0)) + Math.Sqrt(h)
  32. if r<0. then let s = Math.Pow(-r,0.33333333333333333333333333333333)
  33. let t = (-1.*(g/2.0)) - Math.Sqrt(h)
  34. if t<0. then let u = Math.Pow(-t,0.33333333333333333333333333333333)
  35. let x1 = (-s-u) - (b/(3.0*a))
  36. Some(x1,None,None)
  37. else
  38. let u = Math.Pow(t,0.33333333333333333333333333333333)
  39. let x1 = (-s+u) - (b/(3.0*a))
  40. Some(x1,None,None)
  41. else let s = Math.Pow(r,0.33333333333333333333333333333333)
  42. let t = (-1.*(g/2.0)) - Math.Sqrt(h)
  43. if t<0. then let u = Math.Pow(-t,0.33333333333333333333333333333333)
  44. let x1 = (s-u) - (b/(3.0*a))
  45. Some(x1,None,None)
  46. else
  47. let u = Math.Pow(t,0.33333333333333333333333333333333)
  48. let x1 = (s+u) - (b/(3.0*a))
  49. Some(x1,None,None)
  50.  
  51. else None
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement