C#  -  Tratando com Números Complexos


 Hoje veremos como tratar números complexos na linguagem C# usando um recurso disponível a partir do .NET Framework 4.0.

A solução da equação x² - 2x + 5 = 0
nós conduz ao seguinte resultado :

Sabemos que o número não pertence ao conjunto dos números reais, pois não existe nenhum número que elevado ao quadrado resulte em -1.

Para que a equação acima tenha solução, temos que estender o conjunto dos números reais para obter um novo conjunto, chamado de conjunto dos números complexos e representado por .

O número  foi denominado unidade imaginária e criou-se o número i, de modo que:  i² = -1 logo  i =

(fonte: https://www.somatematica.com.br/emedio/complexos/complexos.php acessando em janeiro/2019)

Podemos tratar números complexos usando o namespace System.Numerics usando o novo tipo Struct chamado Complex que lida com números complexos que epresenta números complexos e permite realizar operações aritméticas com números complexos. Para isso basta referenciar a library no projeto.

O tipo Complex usa o sistema de coordenadas cartesianas (real, imaginário) ao criar uma instância e manipular números complexos. Um número complexo pode ser representado como um ponto em um sistema de coordenadas bidimensional, que é conhecido como plano complexo. A parte real do número complexo é posicionada no eixo x (o eixo horizontal), e a parte imaginária é posicionada no eixo y (o eixo vertical).

Criando uma instância de um número complexo

Você pode atribuir um valor em um número complexo em uma das seguintes maneiras:

  • Passando dois valores Double para seu construtor. O primeiro valor representa a parte real do número complexo e o segundo valor representa sua parte imaginária. Esses valores representam a posição do número complexo no sistema de coordenadas cartesianas bidimensional.
  • Chamando o método estático Complex.FromPolarCoordinates para criar um número complexo de suas coordenadas polares.
  • Atribuindo um valor Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, ou Double para um objeto Complex. O valor se tornará a parte real do número complexo e sua parte imaginária é igual a 0.
  • Convertendo um valor Decimal ou BigInteger para um objeto Complex. O valor se tornará a parte real do número complexo e sua parte imaginária será igual a 0.
  • Atribuindo o número complexo que é retornado por um método ou operador para um objeto Complex. Por exemplo, Complex.Add é um método estático que retorna um número complexo que é a soma dos dois números complexos, e o operador Complex.Addition adiciona dois números complexos e retorna o resultado.

Operações com números complexos

A Struct Complex no .NET Framework inclui membros que fornecem a seguinte funcionalidade:

  • Métodos para comparar dois números complexos para determinar se eles são iguais.
  • Operadores para executar operações aritméticas em números complexos. Operadores Complex permitem executar adição, subtração, multiplicação, divisão e negação unária com números complexos.
  • Métodos para executar outras operações numéricas em números complexos. As quatro operações aritméticas básicas, além de gerar um número complexo a uma potência especificada, localizar a raiz quadrada de um número complexo e obter o valor absoluto de um número complexo.
  • Métodos para executar operações trigonométricas em números complexos. Por exemplo, você pode calcular a tangente de um ângulo representado por um número complexo.

(fonte: https://docs.microsoft.com/pt-br/dotnet/api/system.numerics.complex?view=netframework-4.7.2)

Podemos obter cada componente de um número complexo usando as propriedades associadas a ele :

  • Real: Representa a parte real do número;
  • Imaginary: representa a parte imaginária do número;
  • Magintude: Obtém o valor absoluto do número do complexo;
  • Phase: Obtém a fase do número complexo;

As propriedades Real e Imaginary são somente leitura e portanto você não pode modificar um valor existente do objeto Complex.

A seguir vou mostrar um forma bem simples de implementar isso.

Recursos Usados

Criando o projeto Windows Forms

Abra o VS 2017 Community e crie um novo projeto (File-> New Project) usando a linguagem C# e o template Windows Forms App (.NET Framework).

Informe um nome a seu gosto. Eu vou usar o nome CSharp_NumerosComplexos;

Clique no menu Project -> Add Reference e inclua uma referência ao namespace System.Numerics:

Agora inclua no formulário Form1 os seguintes controles a partir da ToolBox:

  • GroupBox - grpNumerosComplexos e grpOperacoes
  • Labels
  • TextBox
  • Buttons

Disponha os controles conforme o leiaute da figura abaixo:

Defina os namespaces usados no formulário conforme abaixo:

using System;
using System.Numerics;
using System.Windows.Forms;

Defina as seguintes variáveis que serão usadas nos cálculos do formulário:

private Complex z1;
private Complex z2;
private Complex resultado;
private double z1_r;
private double z1_i;
private double z2_r;
private double z2_i;

Crie um método chamado Validar() que verifica se os números complexos foram informados corretamente:

public bool Validar()
{
    if (Z1_Real.Text == string.Empty | Z1_Imaginario.Text == string.Empty | Z2_Real.Text == string.Empty | Z2_Imaginario.Text == string.Empty)
    {
         MessageBox.Show("Informe os valores válidos para os números complexos...", "Inválido.", MessageBoxButtons.OK, MessageBoxIcon.Error);
         return false;
    }
    else
          return true;
}

Crie o método MontaNumerosComplexos que define os números complexos com base na informação do usuário :

        private void MontaNumerosComplexos()
        {
            z1_r = Convert.ToDouble(Z1_Real.Text);
            z1_i = Convert.ToDouble(Z1_Imaginario.Text);
            z2_r = Convert.ToDouble(Z2_Real.Text);
            z2_i = Convert.ToDouble(Z2_Imaginario.Text);
            z1 = new Complex(z1_r, z1_i);
            z2 = new Complex(z2_r, z2_i);
        }

A seguir temos o código dos eventos Click de cada botão que realiza as operações para somar, subtrair, multiplicar, dividir , raiz quadrada e cálculo do conjugado:

      private void btnAdicao_Click(object sender, EventArgs e)
        {
            if (Validar())
            {
                MontaNumerosComplexos();
                resultado = Complex.Add(z1, z2);
                var final = $"{resultado.Real} + {resultado.Imaginary}i";
                txtResultadoAdicao.Text = final;
            }
        }
        private void btnSubtracao_Click(object sender, EventArgs e)
        {
            if (Validar())
            {
                MontaNumerosComplexos();
                resultado = Complex.Subtract(z1, z2);
                var final = $"{resultado.Real} + {resultado.Imaginary}i";
                txtResultadoSubtracao.Text = final;
            }
        }
        private void btnMultiplicacao_Click(object sender, EventArgs e)
        {
            if (Validar())
            {
                MontaNumerosComplexos();
                resultado = Complex.Multiply(z1 , z2);
                var final = $"{resultado.Real} + {resultado.Imaginary}i";
                txtResultadoMultiplicacao.Text = final;
            }
        }
        private void btnDivisao_Click(object sender, EventArgs e)
        {
            if (Validar())
            {
                MontaNumerosComplexos();
                resultado = Complex.Divide(z1,z2);
                var final = $"{resultado.Real} + {resultado.Imaginary}i";
                txtResultadoDivisao.Text = final;
            }
        }
        private void btnCalcularRaizQuadradaZ1_Click(object sender, EventArgs e)
        {
            if (Validar())
            {
                MontaNumerosComplexos();
                resultado = Complex.Sqrt(z1);
                var final = $"{resultado.Real} + {resultado.Imaginary}i";
                txtRaizQuadradaZ1.Text = final;
            }
        }
        private void btnCalcularConjugados_Click(object sender, EventArgs e)
        {
            if (Validar())
            {
                MontaNumerosComplexos();
                Complex conjugado1 = Complex.Conjugate(z1);
                Complex conjugado2 = Complex.Conjugate(z2);
                txtConjugadoZ1.Text = conjugado1.ToString();
                txtConjugadoZ2.Text = conjugado2.ToString();
            }
        }

Neste código estamos usando os métodos da classe Complex para realizar as operações :

  • Somar - Complex.Add(z1,z2)
  • Subtrair - Complex.Subtract(z1,z2)
  • Mulitplicar - Complex.Multiply(z1,z2)
  • Dividir - Complex.Divide(z1,z2)
  • Raiz Quadrada - Complex.Sqrt(z1,z2)
  • Conjugado de Z - Complex.Conjugate(z)

Para exibir o resultado no formato retangular (a+bi) estamos usando as propriedades Real e Imaginary da struct Complex e montando o número complexo na expressão :  var final = $"{resultado.Real} + {resultado.Imaginary}i";

Finalmente o código dos eventos Click dos botões Sair e Limpar

       private void btnSair_Click(object sender, EventArgs e)
        {
            string message = "Deseja Encerrar o programa ?";
            string title = "Encerrar";
            MessageBoxButtons buttons = MessageBoxButtons.YesNo;
            DialogResult result = MessageBox.Show(message, title, buttons);
            if (result == DialogResult.Yes)
            {
                this.Close();
            }
        }
        private void btnLimpar_Click(object sender, EventArgs e)
        {
            LimpaPainel(this.grpNumerosComplexos);
            LimpaPainel(this.grpOperacoes);
        }
        public void LimpaPainel(GroupBox control)
        {
            foreach (Control ctr in control.Controls)
            {
                if (ctr is TextBox)
                {
                    ctr.Text = "";
                }
            }                
        }

Executando o projeto iremos obter:

Poderíamos implementar outros cálculos e se você desejar fazer isso veja as referências para os métodos da classe Complex.

Nota:  Voce pode verificar o resultado on-line usando este link: https://www.symbolab.com/solver/complex-numbers-calculator

Se você desejar pode também usar as bibliotecas de terceiros. Vou apontar uma que é grátis :

  1. http://www.codeproject.com/KB/dotnet/complex_math.aspx

Basta acessar o link, baixar a DLL e consultar a documentação.

Pegue o projeto completo aqui :  CSharp_NumerosComplexos.zip

"Não quero, porém, irmãos, que sejais ignorantes acerca dos que já dormem, para que não vos entristeçais, como os demais, que não têm esperança.
Porque, se cremos que Jesus morreu e ressuscitou, assim também aos que em Jesus dormem, Deus os tornará a trazer com ele."

1 Tessalonicenses 4:13,14

 
Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

Referências:


José Carlos Macoratti