Doubt Equation second degree , returns the real and imaginary parts

Asked

Viewed 116 times

1

I’m having a doubt in an example I’m trying to develop in Isp the exercise says:

Modify the function that returns the roots of a second degree so that the real and imaginary parts of the roots return, in the case of they are complex. Suppose the coefficients are real.

I developed it that way :

(defun raizes(a b c)
  (let (
         (raiz1 (/(+ (* -1 b)(sqrt (- (expt b 2)(* 4 a c ))))(* 2 a)))

         (raiz2 (/(- (* -1 b)(sqrt (-(expt b 2)(* 4 a c ))))(* 2 a)))
       )
    (format t "x1=~,2f" raiz1)
    (format t ", x2=~,2f~%" raiz2)

   )       
  )



(raizes 1 -3 -4)
(raizes 1 0 -4)
(raizes 6 11 -35)
(raizes 1 -7 0)
(raizes 5 3 5)

But I can’t do the part that the exercise asks to return the real parts and imagine in case it’s complex.

2 answers

0

I separated the roots into two plots:

inserir a descrição da imagem aqui

The first real installment and the second installment may be real or imaginary.

(defun raizes(a b c)
  (let ((raiz-a (/ (- b) (* 2.0 a)))
    (raiz-b (/ (sqrt (abs (- (expt b 2) (* 4 a c )))) (* 2.0 a))))
    (if (> (* 4 a c) (expt b 2))
    `((,raiz-a ,(- raiz-b)) (,raiz-a ,raiz-b))
      `((,(- raiz-a raiz-b) 0) (,(+ raiz-a raiz-b) 0)))))

(raizes 1 -3 -4) ; => ((-1.0 0) (4.0 0))
(raizes 1 0 -4) ; => ((-2.0 0) (2.0 0))
(raizes 6 11 -35) ; => ((-3.5 0) (1.6666665 0))
(raizes 1 -7 0) ; => ((0.0 0) (7.0 0))
(raizes 5 3 5) ; => ((-0.3 -0.95393926) (-0.3 0.95393926))

0

The ideal is to use modularity, so you can do any calculation and then the selectors, like this:

  ;; Construtores

;; cria-complexo-rect: real, real -> complexo
;; cria um número complexo dadas coordenadas rectangulares
(define (cria-complexo-rect x y) 
  (cons x y))

;; cria-complexo-polar: real, real -> complexo
;; cria um número complexo dadas coordenadas polares
(define (cria-complexo-polar m a) 
  (cons (* m (cos a)) 
        (* m (sin a))))

;----------------------------------------------------------------------   

;; Selectores

;; parte-real: complexo -> real
;; extrai a parte real de um numero complexo
(define (parte-real z)
  (car z))

;; parte-imaginária: complexo -> real
;; extrai a parte imaginária de um numero complexo
(define (parte-imaginária z)
  (cdr z))

;; magnitude: complexo -> real
;; extrai a magnitude de um numero complexo
(define (magnitude z)
  (sqrt (+ (quadrado (parte-real z)) 
           (quadrado (parte-imaginária z)))))

;; ângulo: complexo -> real
;; extrai o ângulo de um numero complexo
(define (ângulo z)
  (atan (/ (parte-imaginária z)
           (parte-real z))))

;----------------------------------------------------------------------

;; soma-complexos: complexo, complexo -> complexo
;; soma dois números complexos
(define (soma-complexos z1 z2)
  (cria-complexo-rect (+ (parte-real z1) (parte-real z2))
                      (+ (parte-imaginária z1) (parte-imaginária z2))))

;; subtrai-complexos: complexo, complexo -> complexo
;; subtrai dois números complexos
(define (subtrai-complexos z1 z2)
  (cria-complexo-rect (- (parte-real z1) (parte-real z2))
                      (- (parte-imaginária z1) (parte-imaginária z2))))

;; multiplica-complexos: complexo, complexo -> complexo
;; multiplica dois números complexos
(define (multiplica-complexos z1 z2)
  (cria-complexo-polar (* (magnitude z1) (magnitude z2))
                       (+ (ângulo z1) (ângulo z2))))

;; divide-complexos: complexo, complexo -> complexo
;; divide dois números complexos
(define (divide-complexos z1 z2)
  (cria-complexo-polar (/ (magnitude z1) (magnitude z2))
                       (- (ângulo z1) (ângulo z2))))


;; imprime-complexo-rect: complexo ->
;; imprime um número complexo na forma rectangular
(define (imprime-complexo-rect z)
  (display (parte-real z))
  (display " + j")
  (display (parte-imaginária z)))


;; imprime-complexo-polar: complexo ->
;; imprime um número complexo na forma polar
(define (imprime-complexo-polar z)
  (display (magnitude z))
  (display " |")
  (display (ângulo z)))

;----------------------------------------------------------------------

;; Procedimento auxiliar

;; quadrado: número -> número
;; calcula o quadrado de um número
(define (quadrado x)
  (* x x))

;; Contrato
;; (parte-real (cria-complexo-rect <x> <y>)) => <x>
;; (parte-real (cria-complexo-polar <m> <a>)) => <m> . cos(<a>)
;; (parte-imaginária (cria-complexo-rect <x> <y>)) => <y>
;; (parte-imaginária (cria-complexo-polar <m> <a>)) => <m> . sen(<a>)
;; (magnitude (cria-complexo-polar <m> <a>)) => <m>
;; (magnitude (cria-complexo-rect <x> <y>)) => sqrt(<x>.<x> + <y>.<y>)
;; (ângulo (cria-complexo-polar <m> <a>)) => <a> + k.pi, k inteiro
;; (ângulo (cria-complexo-rect <x> <y>)) => arctg(<y>/<x>) + k.pi, k inteiro

Browser other questions tagged

You are not signed in. Login or sign up in order to post.