Relaxação!

Neste arquivo iremos colocar os problemas já resolvidos (não são problemas "mortos" porque a discussão pode continuar a qualquer altura!)

Relaxação!

Mensagempor jap em Segunda Jul 09, 2007 1:07 am

Não, ainda não é altura para relaxarmos e irmos todos de férias! :D

Este problema vem a pedido do Miguel Pais, que gosta de problemas para serem resolvidos no computador. :lol:

Mas primeiro vou ensinar-vos um método muito útil para resolver problemas de electrostática e outros problemas de Física, que envolvem a resolução da equação diferencial


\frac{\partial^2 \phi}{\partial x^2} + \frac{\partial^2 \phi}{\partial y^2} + \frac{\partial ^2 \phi}{\partial z^2} = 0.

Por vezes esta equação é escrita na forma


\nabla^2 \phi(x,y,z) = 0,

onde \nabla^2 é o operador diferencial


\nabla^2 = \frac{\partial^2  }{\partial x^2} + \frac{\partial^2 }{\partial y^2} + \frac{\partial ^2  }{\partial z^2}.

A equação acima é conhecida por equação de Laplace.

Ora acontece que o potencial electrostático V(x,y,z) numa região onde não há cargas obedece a essa equação:

\nabla^2 V(x,y,z) = 0.


Isto resulta directamente da lei de Coulomb, mas não vou agora demonstrar que é assim. :?


O problema de encontrar o potencial V(x,y,z) numa região onde não há carga eléctrica, conhecendo o potencial na fronteira dessa região é um problema comum em física e que se resume a encontrar a solução da equação

\nabla^2 V(x,y,z) = 0.

nessa região, dado o potencial na fronteira que delimita a região.

As funções que são solução da equação de Laplace denominam-se funções harmónicas e têm uma propriedade muito interessante: o valor da função num ponto é igual á media do valor da função à sua volta, mais propriamente, se \phié uma função harmónica,

\phi(x,y,z) = \frac{1}{6} \left ( \phi_1 + \phi_2 + \phi_3 + \phi_4 + \phi_5 + \phi_6 \right )

onde

\phi_1  = \phi(x+h,y,z)
\phi_2  = \phi(x-h,y,z)

\phi_3  = \phi(x,y+h,z)
\phi_4  = \phi(x,y-h,z)

\phi_5  = \phi(x,y,z+h)
\phi_6  = \phi(x,y,z-h).

O potencial electrostático numa região sem carga é uma função harmónica! :shock:

Se o problema for a duas dimensões, digamos um problema de electrostática no plano xy, temos que o potencial eléctrico numa região onde não haja carga obedece a

V(x,y) = \frac{1}{4}\left ( V(x+h,y)+V(x-h,y) + V(x,y+h)+ V(x,y-h) \right )

Como utilizar estas equações para resolver problemas de electrostática? Veremos isso amanhã... :wink:

Stay tuned. :D
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6801
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Mensagempor jap em Segunda Jul 09, 2007 11:06 pm

Bem, vamos lá continuar a explicar o método da relaxação. :D

Suponham que querem calcular o potencial no interior de uma caixa rectangular metálica, ligada à terra, que contém no seu interior um objecto metálico carregado, que está à tensão de 5 V (ver figura)


Imagem


Dividamos o espaço no interior da caixa numa grelha de pontos. Os pontos da fronteira exterior, na figura a negro carregado, ou seja, a caixa, estão todos ao potencial zero.

Imagem


Há uma fronteira interior, que definimos através dos pontos a vermelho, que está ao potencial 5 V.


Imagem

O potencial nos pontos interiores, entre as duas fronteiras, é único e é dado por uma função harmónica, como já vimos. Na realidade os pontos da fronteira (interior e exterior) determinam de forma unívoca essa função harmónica. :D

Para calcularmos o potencial nos pontos interiores da rede, procedamos da seguinte forma: atribuímos a cada um dos pontos interiores o valor médio do potencial dos seus vizinhos. Depois de fazermos este cálculo, temos uma primeira aproximação, bastante má ainda, para o potencial. Mas repitamos o procedimento, ou seja, depois de uma primeira passagem (de cálculo da média do potencial dos vizinhos) sobre todos os pontos façamos de novo o cálculo da média, e mais uma vez, e outra vez... :lol:

Verão que passado um certo número de ciclos os valores do potencial nos pontos da grelha começam a estabilizar... :wink:

Usando um computador é fácil repetir o procedimento até que não haja mais do que, digamos 1%, ou 1 por mil de variação.

Et voilá, calcularam o potencial para uma situação que não é nada fácil de calcular analíticamente. :D

E podem estender este método de cálculo a situações tridimensionais, com vários objectos carregados, de formas bizarras. Claro que para ter uma boa definição, convém usar uma grelha bastante fina... e um computador, é claro!

Gostaram? :roll: Alguém quer programar? :D
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6801
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Mensagempor vbmaster em Segunda Jul 09, 2007 11:36 pm

Ok, então a fronteira está a 0V, e as fronteiras do objecto dentro da caixa estão a 5V.

E eu vou correr cada ponto da grelha e obter o seu pontencial tendo em conta a intersecção que está:

- acima;
- abaixo;
- à esquerda
- á direita

Mas por exemplo, se eu selecionar a primeira intersecção do canto superior esquerdo, como é que eu sei o potencial desse ponto se não sei o potencial do que está abaixo nem o que está à direita?

Outra coisa, os pontos dentro do objecto não são considerados, influencia alguma coisa o tamanho do objecto e o da caixa? Para poder conceptualizar os pontos que deverão ser ignorados...
Avatar do utilizador
vbmaster
up-Quark!
up-Quark!
 
Mensagens: 464
Registado: Quarta Nov 15, 2006 11:49 pm
Localização: Peniche

Mensagempor jap em Segunda Jul 09, 2007 11:42 pm

vbmaster Escreveu:(...)
Mas por exemplo, se eu selecionar a primeira intersecção do canto superior esquerdo, como é que eu sei o potencial desse ponto se não sei o que está abaixo nem o que está à direita?
(...)


Aí está a coisa mais gira do método: podes atribui aos pontos cujo potencial desconheces no início qualquer valor arbitrário - não importa. :shock: Por exemplo podes dizer que, no 1º ciclo, todos os pontos da grelha que não são de fronteira estão ao potencial zero, ou, ainda melhor, estão a 2,5 V. Não importa, porque no final vais obter o mesmo resultado! :D

Os pontos do interior do pedaço metálico a 5 V não interessam - na realidade eles estão a 5 V ( o metal é equipotencial!), mas para o método só precisas mesmo dos pontos da fronteira. Não deves aplicar o cálculo da média aos pontos do metal nem aos pontos da caixa - estes estão fixos a 5 e zero volts, respectivamente.

Deu para perceber? :roll:
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6801
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Mensagempor vbmaster em Segunda Jul 09, 2007 11:48 pm

E posso definir o meu próprio objecto certo?

Do género, um objecto quadrado de 4*4cm, numa caixa de 10*10cm, a 2cm de cada lado da fronteira externa (dá-me mais jeito para os loops do que algo circular, penso eu)

Certo, então se poder definir os pontos interiores a 2V o pontecial do ponto que referi seria:

\phi (0,0) = \frac{1}{4} (0 + 0 + 2 + 2)
Avatar do utilizador
vbmaster
up-Quark!
up-Quark!
 
Mensagens: 464
Registado: Quarta Nov 15, 2006 11:49 pm
Localização: Peniche

Mensagempor kelker em Segunda Jul 09, 2007 11:58 pm

jap Escreveu:
vbmaster Escreveu:(...)
Mas por exemplo, se eu selecionar a primeira intersecção do canto superior esquerdo, como é que eu sei o potencial desse ponto se não sei o que está abaixo nem o que está à direita?
(...)


Aí está a coisa mais gira do método: podes atribui aos pontos cujo potencial desconheces no início qualquer valor arbitrário - não importa. :shock: Por exemplo podes dizer que, no 1º ciclo, todos os pontos da grelha que não são de fronteira estão ao potencial zero, ou, ainda melhor, estão a 2,5 V. Não importa, porque no final vais obter o mesmo resultado! :D

Os pontos do interior do pedaço metálico a 5 V não interessam - na realidade eles estão a 5 V ( o metal é equipotencial!), mas para o método só precisas mesmo dos pontos da fronteira. Não deves aplicar o cálculo da média aos pontos do metal nem aos pontos da caixa - estes estão fixos a 5 e zero volts, respectivamente.

Deu para perceber? :roll:

Se bem me lembro, essa atribuição "arbitrária" convém que seja próxima do que se espera vir a obter, que é para diminuir o número de iterações necessárias para obter um bom resultado... O resultado final é sempre o mesmo, mas convém dar o mínimo de trabalho ao computador. :P
Partilha os teus conhecimentos em sophia.
Avatar do utilizador
kelker
down-Quark!
down-Quark!
 
Mensagens: 148
Registado: Terça Mar 13, 2007 10:56 pm
Localização: Aveiro & Leiria

Mensagempor jap em Terça Jul 10, 2007 12:02 am

kelker Escreveu:Se bem me lembro, essa atribuição "arbitrária" convém que seja próxima do que se espera vir a obter, que é para diminuir o número de iterações necessárias para obter um bom resultado... O resultado final é sempre o mesmo, mas convém dar o mínimo de trabalho ao computador. :P


Isso mesmo! :D
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6801
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Mensagempor vbmaster em Terça Jul 10, 2007 12:03 am

jap Escreveu:
kelker Escreveu:Se bem me lembro, essa atribuição "arbitrária" convém que seja próxima do que se espera vir a obter, que é para diminuir o número de iterações necessárias para obter um bom resultado... O resultado final é sempre o mesmo, mas convém dar o mínimo de trabalho ao computador. :P


Isso mesmo! :D


E aquilo que disse está certo (no meu post anterior)?

se sim, vou ver se começo a codar alguma coisa...
Avatar do utilizador
vbmaster
up-Quark!
up-Quark!
 
Mensagens: 464
Registado: Quarta Nov 15, 2006 11:49 pm
Localização: Peniche

Mensagempor jap em Terça Jul 10, 2007 12:05 am

vbmaster Escreveu:E posso definir o meu próprio objecto certo?

Do género, um objecto quadrado de 4*4cm, numa caixa de 10*10cm, a 2cm de cada lado da fronteira externa (dá-me mais jeito para os loops do que algo circular, penso eu)

Certo, então se poder definir os pontos interiores a 2V o pontecial do ponto que referi seria:

\phi (0,0) = \frac{1}{4} (0 + 0 + 2 + 2)


Sim, podes testar com um quadrado dentro de um quadrado! É, de facto, mais fácil de programar, mas o método funciona com formas arbitrárias - é só uma questão de conveniência de programação! :wink:
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6801
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Mensagempor vbmaster em Terça Jul 10, 2007 12:12 am

Ainda bem, vou programar. :P
Avatar do utilizador
vbmaster
up-Quark!
up-Quark!
 
Mensagens: 464
Registado: Quarta Nov 15, 2006 11:49 pm
Localização: Peniche

Mensagempor vbmaster em Terça Jul 10, 2007 2:48 am

Bem, devo estar a fazer algo mal de certeza.

Se o método é, fazer as médias de todos os valores várias vezes e esperar que no conjunto todos os valores fiquem aproximados, acho que me falta loops (embora tenha dado 100 000 o que me demorou meia hora de processamento).

Fiz uma array de 1000 * 1000 que representa um quadrado de 1m^2.

Lá dentro está um outro quadrado de 0.6m^2, que representa o objecto.

A array tem nas bordas potenciais de valor 0, e uma certa área interior com potênciais 5V, que correspondem, claro, ao objecto. Os valores intermédios foram preenchidos com potênciais 2,5 V. A grelha tem portanto um espaçamento de 1mm.

fiz várias vezes o loop do varrimento de todas as intersecções mais o resultado está à vista:

ftp://ftp.ua.pt/incoming/cenaS/lol.txt


Para o seguinte código:

Código: Seleccionar Todos
#include <iostream>
#include <math.h>
using namespace std;

float grelha [1001][1001];

void preenche ()
{
  for (int vertical = 0; vertical < 1001; vertical++)
    {
      for (int horizontal = 0; horizontal < 1001; horizontal++)
        {
          if (vertical == 0 || vertical == 1000 || horizontal == 0 || horizontal == 1000)
            grelha[vertical][horizontal] = 0.0;
          else
            {
              if ((horizontal >= 200 && horizontal <= 800) && (vertical >= 200 && vertical <= 800))
                grelha[vertical][horizontal] = 5.0;
              else
                {
                  grelha[vertical][horizontal] = 2.5;
                }
            }
        }
    }
}

void varre ()
{
  for (int vertical = 1; vertical < 1000; vertical++)
    {
      for (int horizontal = 1; horizontal < 1000; horizontal++)
        {
          if (fabs(grelha[vertical][horizontal] - 5) > 1E-6)
            {
              grelha[vertical][horizontal] = (grelha[vertical][horizontal + 1] + grelha[vertical][horizontal - 1] + grelha[vertical + 1][horizontal] + grelha[vertical - 1][horizontal]) / 4;
            }
        }
    }
}

void mostra ()
{
    for (int vertical = 1; vertical < 1000; vertical++)
    {
      for (int horizontal = 1; horizontal < 1000; horizontal++)
        {
            cout << grelha[vertical][horizontal] << " ";
        }
      cout << endl;
    }
}

int main ()

{
  preenche ();
  for (int loop = 0; loop <= 100000; loop++)
    {
      varre ();
    }

  mostra ();
  return 0;
}
Avatar do utilizador
vbmaster
up-Quark!
up-Quark!
 
Mensagens: 464
Registado: Quarta Nov 15, 2006 11:49 pm
Localização: Peniche

Mensagempor jap em Terça Jul 10, 2007 8:32 pm

Parabéns, Miguel! :hands:


É isso mesmo; claro que há alguns truques para acelerar a convergência do método, mas o teu programa funciona! :D

Aqui está o resultado; vejam como o potencial sobe harmoniosamente de 0 V (caixa) até 5 V (placa no interior). Não é bonito? :roll:

Imagem
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6801
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Mensagempor Ivo_Timóteo em Terça Jul 10, 2007 9:34 pm

O Miguel a "jingar" por entre o Code mais uma vez :D
Avatar do utilizador
Ivo_Timóteo
charm-Quark!
charm-Quark!
 
Mensagens: 579
Registado: Quarta Nov 15, 2006 7:25 pm
Localização: V. N. Gaia

Mensagempor vbmaster em Terça Jul 10, 2007 10:16 pm

jap Escreveu:Parabéns, Miguel! :hands:


É isso mesmo; claro que há alguns truques para acelerar a convergência do método, mas o teu programa funciona! :D


Só queria ter o prazer de chegar ao tal ponto em que todos os pontos apresentariam o mesmo....

Talvez a rede seja fina de mais (sim, por que no príncpio estava a fazer o programa com uma grelha ao milimetro para um quadrado de 10m^2!), e talvez pudesse pôr um valor, como o kelker disse, que vá mais de encontro ao esperado... mas, qual é o esperado?

btw, essa gráfico foi feito com os meus dados?
Avatar do utilizador
vbmaster
up-Quark!
up-Quark!
 
Mensagens: 464
Registado: Quarta Nov 15, 2006 11:49 pm
Localização: Peniche

Mensagempor jap em Terça Jul 10, 2007 10:45 pm

vbmaster Escreveu:
(...)
btw, essa gráfico foi feito com os meus dados?


É claro que sim! É o resultado do teu programa que eu usei no gnuplot para fazer o gráfico! :D

Simplesmente, modifiquei o teu código c++ para uma rede de 100x100 em vez de 1000 x 1000 para não ter de fazer o plot de um ficheiro de saída monstruoso! :lol:

E a propósito, a convergência do método não acontece quando todos os pontos dão o mesmo, como tu dizes ( oq ue não faria sentido nenhum, do ponto de vista físico), mas sim quando os valores de cada ponto, em dois ciclos sucessivos, já não variam praticamente nada! Podes verificar que isso é assim no teu programa, se comparares os dois últimos ciclos. :wink:
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6801
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Próximo

Voltar para Problemas resolvidos

Quem está ligado

Utilizadores a navegar neste fórum: Nenhum utilizador registado e 1 visitante