Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- let solve3 (np: normalized_polynomial) : (float * float option * float option) option =
- let extract p =
- match np with
- NormalizedPolynomial(p) -> p
- let array = extract np // applico la funzione extract al polinomio normalizzato in input
- 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
- 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
- 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
- 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.
- let f = (((3.*c)/a)- ((b*b)/(a*a)))/3.
- let g = (((2.*(b*b*b))/(a*a*a)) - ((9.*b*c)/(a*a))+((27.*d)/a))/27.
- let h = ((g*g)/4.) + ((f*f*f)/27.0)
- if (f+g+h)=0. then // all roots are real and equal
- let x1 = Math.Pow(float(d/a),0.33333333333333333333333333333333)*(-1.)
- let x2 = Math.Pow(float(d/a),0.33333333333333333333333333333333)*(-1.)
- let x3 = Math.Pow(float(d/a),0.33333333333333333333333333333333)*(-1.)
- Some(x1,Some x2,Some x3)
- elif(h<=0.) then // all 3 roots are real
- let i = Math.Sqrt(((g*g)/4.) - h)
- let j = Math.Pow(i,0.33333333333333333333333333333333)
- let k = Math.Acos(-(g/(2.*i)))
- let l = j * -1.
- let m = Math.Cos(k/3.)
- let n = Math.Sqrt(3.) *Math.Sin(k/3.)
- let p = (b/(3.*a))* -1.
- let x1 = (2.*j)*Math.Cos(k/3.)-(b/(3.*a))
- let x2 = l * (m+n) + p
- let x3 = l * (m-n) + p
- Some(x1,Some x2,Some x3)
- elif(h>0.) then
- let r = (-1.*(g/2.0)) + Math.Sqrt(h)
- if r<0. then let s = Math.Pow(-r,0.33333333333333333333333333333333)
- let t = (-1.*(g/2.0)) - Math.Sqrt(h)
- if t<0. then let u = Math.Pow(-t,0.33333333333333333333333333333333)
- let x1 = (-s-u) - (b/(3.0*a))
- Some(x1,None,None)
- else
- let u = Math.Pow(t,0.33333333333333333333333333333333)
- let x1 = (-s+u) - (b/(3.0*a))
- Some(x1,None,None)
- else let s = Math.Pow(r,0.33333333333333333333333333333333)
- let t = (-1.*(g/2.0)) - Math.Sqrt(h)
- if t<0. then let u = Math.Pow(-t,0.33333333333333333333333333333333)
- let x1 = (s-u) - (b/(3.0*a))
- Some(x1,None,None)
- else
- let u = Math.Pow(t,0.33333333333333333333333333333333)
- let x1 = (s+u) - (b/(3.0*a))
- Some(x1,None,None)
- else None
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement