سؤال

يجب أن كتابة برنامج لحل quadratics إرجاع عدد معقدة نتيجة.

لقد حصلت حتى الآن, مع تحديد عدد معقدة ، معلنا أن يكون جزءا من الأسطوانات ، لذا + ، - * - ing يمكن أن تأخذ مكان.

أنا أيضا تعريف نوع البيانات معادلة من الدرجة الثانية, ولكن أنا الآن عالقة مع الفعلي حل من الدرجة الثانية.الرياضيات هي فقيرة جدا ، لذلك أي مساعدة سيكون موضع تقدير كبير...

data Complex = C {
re :: Float,
im :: Float
} deriving Eq

-- Display complex numbers in the normal way

instance Show Complex where
    show (C r i)
        | i == 0            = show r
        | r == 0            = show i++"i"
        | r < 0 && i < 0    = show r ++ " - "++ show (C 0 (i*(-1)))
        | r < 0 && i > 0    = show r ++ " + "++ show (C 0 i)
        | r > 0 && i < 0    = show r ++ " - "++ show (C 0 (i*(-1)))
        | r > 0 && i > 0    = show r ++ " + "++ show (C 0 i)


-- Define algebraic operations on complex numbers
instance Num Complex where
    fromInteger n       = C (fromInteger n) 0 -- tech reasons
    (C a b) + (C x y)   = C (a+x) (b+y)
    (C a b) * (C x y)   = C (a*x - b*y) (b*x + b*y)
    negate (C a b)      = C (-a) (-b)

instance Fractional Complex where
    fromRational r      = C (fromRational r) 0 -- tech reasons
    recip (C a b)       = C (a/((a^2)+(b^2))) (b/((a^2)+(b^2)))


root :: Complex -> Complex
root (C x y)
    | y == 0 && x == 0  = C 0 0
    | y == 0 && x > 0   = C (sqrt ( ( x + sqrt ( (x^2) + 0 ) ) / 2 ) )  0
    | otherwise         = C (sqrt ( ( x + sqrt ( (x^2) + (y^2) ) ) / 2 ) ) ((y/(2*(sqrt ( ( x + sqrt ( (x^2) + (y^2) ) ) / 2 ) ) ) ) )


-- quadratic polynomial : a.x^2 + b.x + c
data Quad = Q {
    aCoeff, bCoeff, cCoeff :: Complex
    } deriving Eq


instance Show Quad where
    show (Q a b c) = show a ++ "x^2 + " ++ show b ++ "x + " ++ show c

solve :: Quad -> (Complex, Complex)
solve (Q a b c) = STUCK!

تحرير:يبدو أنني قد غاب المغزى من استخدام بلدي معقدة نوع البيانات " رقم " معرفة أنواع البيانات المخصصة.أنا أدرك جيدا أن أتمكن من استخدام المعقدة.البيانات.أي مساعدة يمكن أن يتم باستخدام بلدي حل حتى الآن سيكون موضع تقدير كبير.\

تحرير 2: يبدو أن سؤالي الأول كان شديد اللهجة فظيعة.أنا على علم بأن الصيغة التربيعية سيعود كل من (أو واحدة فقط) الجذر لي.حيث أواجه مشكلة تعود هذه الجذور مثل (مجمع مجمع) tuple مع رمز أعلاه.

أنا أدرك جيدا أن أتمكن من استخدام المدمج في وظائف من الدرجة الثانية كما تم عرضها أدناه ، ولكن ليس هذا هو ممارسة الرياضة.الفكرة من وراء هذه العملية ، وخلق الخاصة منها عدد معقدة نوع البيانات ، هي التعرف على أنواع البيانات المخصصة.

هل كانت مفيدة؟

المحلول

مثل newacct قال إنها معادلة من الدرجة الثانية:

(-b +- sqrt(b^2 - 4ac)) / 2a
module QuadraticSolver where

import Data.Complex
data Quadratic a = Quadratic a a a deriving (Show, Eq)

roots :: (RealFloat a) => Quadratic a -> [ Complex a ]
roots (Quadratic a b c) = 
  if discriminant == 0 
  then [ numer / denom ]
  else [ (numer + root_discriminant) / denom,
         (numer - root_discriminant) / denom ]
  where discriminant = (b*b - 4*a*c)
        root_discriminant = if (discriminant < 0) 
                            then 0 :+ (sqrt $ -discriminant)
                            else (sqrt discriminant) :+ 0
        denom = 2*a :+ 0
        numer = (negate b) :+ 0

في الممارسة:

ghci> :l QuadraticSolver
Ok, modules loaded: QuadraticSolver.
ghci> roots (Quadratic 1 2 1)
[(-1.0) :+ 0.0]
ghci> roots (Quadratic 1 0 1)
[0.0 :+ 1.0,(-0.0) :+ (-1.0)]

والتكيف مع استخدام المصطلحات الخاصة بك:

solve :: Quad -> (Complex, Complex)
solve (Q a b c) = ( sol (+), sol (-) )
  where sol op = (op (negate b) $ root $ b*b - 4*a*c) / (2 * a)

على الرغم من أنني لم أختبر هذا الكود

نصائح أخرى

منذ هاسكل sqrt يمكن أيضا التعامل مع الأرقام المعقدة ، rampion حل حتى يمكن زيادة تبسيط:

import Data.Complex

-- roots for quadratic equations with complex coefficients
croots :: (RealFloat a) =>
          (Complex a) -> (Complex a) -> (Complex a) -> [Complex a]
croots a b c
      | disc == 0 = [solution (+)]
      | otherwise = [solution (+), solution (-)]
   where disc = b*b - 4*a*c
         solution plmi = plmi (-b) (sqrt disc) / (2*a)

-- roots for quadratic equations with real coefficients
roots :: (RealFloat a) => a -> a -> a -> [Complex a]
roots a b c = croots (a :+ 0) (b :+ 0) (c :+ 0)

يمكنك أيضا استخدام هذا croots المهمة الخاصة بك مع نوع البيانات إذا قمت بتغيير أنواع لتناسب التطبيق الخاص بك (و الاتصال الخاص بك root وظيفة بدلا من sqrt).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top