Cálculo de ponto num Triangulo Recto

Tópico em 'Aprendizagem e Formação' iniciado por HotSpot 24 Abr 2009 às 18:27.

  1. HotSpot

    HotSpot
    Expand Collapse
    Cumulonimbus

    Registo:
    20 Nov 2006
    Mensagens:
    3,613
    Local:
    Moita, Setubal
    Preciso da ajuda dos "carolas" matemáticos cá da casa. :D

    Já não tenho matemática faz muito tempo e preciso de ter uma fórmula para fazer interpolação de pontos das saídas do GFS.

    Imaginem que tenho 3 valores num mapa 1, 2 e 5 mm (valores a verde) e preciso de saber qual o valor do ponto A.

    [​IMG]

    Obrigado desde já.
     
    Collapse Signature Expand Signature
  2. David sf

    David sf
    Expand Collapse
    Staff

    Registo:
    8 Jan 2009
    Mensagens:
    3,514
    Local:
    Oeiras / Portel
    Interpolas as 3 rectas, partindo do princípio que os valores se repartem regularmente. Depois unes os pontos de valores iguais e fazes as isos 2, 3 e 4. Se quiseres as casas décimais divide mais as rectas. É um método aproximado, com pouco rigor, mas usado em muitos casos deste tipo.
     
  3. rozzo

    rozzo
    Expand Collapse
    Staff

    Registo:
    11 Dez 2006
    Mensagens:
    1,902
    Local:
    Lisboa
    HotSpot, já tinha tido esta conversa com o Vince, mas reformulo.. ;)

    Há várias formas usuais de interpolar dados de malhas..
    Desde ponto mais próximo, interpolação bilinear, cúbica.. E mais..
    Os mais usuais são os 2 primeiros..

    O primeiro tem o problema de muitas vezes calhar o mesmo ponto para 2 locais diferentes, e de calharem pontos sobre mar por exemplo, que no caso da temperatura claro dá buraco..

    O segundo é interessante, e é o que tu queres fazer (mas com 4 pontos).. Tem no entanto algum perigo em zonas com mar também, mas a verdade é que todos os métodos têm.. Por isso.. ;)

    Interpolação bilinear:
    Vê aqui a formulação
    http://en.wikipedia.org/wiki/Bilinear_interpolation

    Assusta um pouco de repente, mas olhar com calma é fácil, é só ir por comparação, e ter atenção ao sentido que tás a ir nos pontos da malha..
    ;)

    Vai a partir daqui: "If we choose a coordinate system in which the four points where f is known are (0, 0), (0, 1), (1, 0), and (1, 1), then the interpolation formula simplifies to..." (...)



    Espero que seja útil!
     
  4. Vince

    Vince
    Expand Collapse
    Furacão

    Registo:
    23 Jan 2007
    Mensagens:
    10,624
    Local:
    Braga
    Usando a interpolação bilinear sugerida pelo rozzo, dou então um exemplo prático para resolver, interpolar milímetros de precipitação no ponto P.
    Mais logo tento fazer as contas, se alguém quiser experimentar também, força..

    [​IMG]

    Sobre a questão do mar, qual seria a solução ideal ? Provavelmente por experimentação local a local testando diferentes soluções.
     
  5. rozzo

    rozzo
    Expand Collapse
    Staff

    Registo:
    11 Dez 2006
    Mensagens:
    1,902
    Local:
    Lisboa
    Sim Vince, basta meia dúzia de exemplos assim (respeitando a ordem dos pontos da malha que estão a usar, para não haver confusões) e vê-se logo se estão a fazer o algoritmo bem.. ;)
    Quanto à solução do mar.. Na prática não há...
    Cada caso é cada caso.. Na pior das hipóteses é escolher a melhor solução para cada sítio, por experimentação..
    Desde nuns colocar o ponto mais próximo sobre terra, noutros a interpolação bilinear nesse ponto, noutros a interpolação bilinear, mas escolhendo outro ponto mais conveniente que o real.. Isso só com experimentação e testes..

    Mas regra geral, sem estar a colocar 500 IF's no código para fazer caso a caso, as do ponto mais próximo sobre terra e a interpolação bilinear são as mais utilizadas para este tipo de dados generalizando para todas as estações!
    E claro os problemas normalmente surgem junto ao mar ou montanhas..
    Por exemplo em estações tipo Évora não há stresses.. Agora experimentem o Cabo Carvoeiro! :D

    PS: em relação ao método que referi, volto a relembrar que não é preciso assustar com as contas iniciais, pois se for uma malha regularmente espaçada, basta saber a posição relativa entre o ponto pretendido e as coordenadas dos 4 pontos à volta.. ;)


    PS2: Já agora, os cuidados que referi nas zonas mais litorais e montanhosas, referem-se essencialmente à temperatura, que é problemática devido à sua variação enorme junto ao mar, etc.. Para outras variáveis será menos grave, por exemplo na precipitação, a interpolação parece-me simples e sem grandes cuidados.. Especialmente tendo em conta a resolução do modelo! Aliás, vendo bem, à resolução do GFS até a temperatura não terá problemas muito grandes, excepto mesmo no litoral.. Aí por exemplo ter 2 pontos sobre o mar na média, ou 3 pontos, faz uma diferença enorme no resultado final..
     
  6. HotSpot

    HotSpot
    Expand Collapse
    Cumulonimbus

    Registo:
    20 Nov 2006
    Mensagens:
    3,613
    Local:
    Moita, Setubal
    Então vamos esquecer o triângulo e avançar com a Interpolação Bilinear sugerida pelo Rozzo. Alguém consegue resolver este mapa colocado pelo Vince? De forma clara e passo a passo para depois eu aplicar em PHP.

    :thumbsup:

    P.S. Aliciante: quanto mais depressa eu resolver isto, mais cedo ficam disponíveis os GFS em tabela para todos :p
     
    Collapse Signature Expand Signature
  7. rozzo

    rozzo
    Expand Collapse
    Staff

    Registo:
    11 Dez 2006
    Mensagens:
    1,902
    Local:
    Lisboa
    Eu tenho a formula implementada para os meus trabalhos na faculdade.. não em casa.. mas é fácil...

    Pegando no caso que o Vince pôs fica do tipo
    É simplesmente esta fórmula:

    Prec_P = (Prec_A)x(1-deltaX)x(1-deltaY) + (Prec_b)x(deltaX)x(1-deltaY) + (Prec_c)x(1-deltaX)x(deltaY) + (Prec_D)x(deltaX)x(deltaY)

    Em que:
    -deltaX é a distância do ponto P aos pontos da esquerda
    - deltaY é a distância do ponto P aos pontos de cima (ou de baixo, depende da ordem sequencial nos pontos da malha GFS, no caso que o Vince pôs penso que será distância aos pontos de cima)..
    (serão qualquer coisa do tipo: deltaX=long_P-long_A ; deltaY=long_A-long_P , certo?)

    Tanto faz distância em º, ou km's, ou o que fôr, desde que estejam compatíveis todas..

    Chamo só mais uma vez a atenção para verem se a ordem dos pontos em latitude é de cima para baixo ou vice-versa, para não baralhar os termos na expressão, mas se virem que o resultado não faz sentido, é porque está ao contrário, e corrigem rápido..

    Penso que chegará? ;)
     
  8. HotSpot

    HotSpot
    Expand Collapse
    Cumulonimbus

    Registo:
    20 Nov 2006
    Mensagens:
    3,613
    Local:
    Moita, Setubal
    Aplica lá os valores do Vince nessa formula sff :D

    Rozzo, não tenho matemática há 15 anos. É complicado olhar para "letras" em vez de números. :huh:
     
    Collapse Signature Expand Signature
  9. rozzo

    rozzo
    Expand Collapse
    Staff

    Registo:
    11 Dez 2006
    Mensagens:
    1,902
    Local:
    Lisboa
    Tenho de corrigir uma coisa que disse só..
    Na formulação que coloquei..
    Os deltaX e deltaY têm de ser entre 0 e 1..
    Simples:

    - Se o ponto pretendido fosse exactamente sobre o ponto A, então deltaX e deltaY seriam 0.
    - Se o ponto pretendido fosse exactamente sobre o ponto B, então deltaX seria 1 e deltaY seria 0.
    - Se o ponto pretendido fosse exactamente sobre o ponto C, então deltaX seria 0 e deltaY seria 1.
    - Se o ponto pretendido fosse exactamente sobre o ponto D, então deltaX e deltaY seriam 1.

    Ou seja:

    deltaX=(longitude do ponto P - longitude do ponto A)/espaçamento da malha
    deltaY=(latitude do ponto A - latitude do ponto P)/espaçamento da malha

    Assim está certo!

    HotSpot, se reparares, o que chamei Prec_A,etc, são os valores que o Vince pôs para cada ponto, é colocá-los lá, e depois cada um tem um peso, dado de acordo com a posição do ponto P!

    Mais uma vez, se fosse exactamente em cima do ponto A, então:
    deltaX=0;deltaY=0;
    (Prec_A)x(1-deltaX)x(1-deltaY)=5x(1-0)x(1-0)=5x1=5
    O que é óbvio pois só esse ponto tem peso, os outros termos da expressão se fizeres a conta da mesma forma vão ficar com peso 0!

    Se fosse o ponto P exactamente em cima do ponto B ficaria:
    deltaX=1;deltaY=0;
    (Prec_B)x(deltaX)x(1-deltaY)=3x1x(1-0)=3x1=3
    Os outros termos vão todos dar zero mais uma vez, se substituires na equação toda.

    Se for um ponto no meio dos 4, os deltaX e deltaY calculados para esse ponto, vão dar o peso que cada uma das precipitações tem no resultado final!
     
  10. Vince

    Vince
    Expand Collapse
    Furacão

    Registo:
    23 Jan 2007
    Mensagens:
    10,624
    Local:
    Braga
    Assim já deves perceber melhor. A formula usada é a formula simplificada do artigo da wiki que se usa se tivermos uma grelha (0, 0), (0, 1), (1, 0), (1, 1), o que ao princípio podia ser um obstáculo pois temos uma escala de 0.5, mas sabendo que temos sempre essa escala basta multiplicar por 2, e temos sempre o x ou o y a variar entre 0 e 1.

    [​IMG]

    [​IMG] [​IMG]




    Em código fica mais ou menos isto, o resultado do exemplo é 2.209 mm
    As coordenadas terão que ser decimais nos cálculos.

    Código:
                // x Longitude
                // y Latitude
    
                double x, y, px, py, x0, y0 ;
                double fp, f01, f11, f00, f10;
    
                x0 = -9.5;
                y0 = 38.5;
    
                // Coordenadas de p        
                px = -9.13;
                py = 38.71;
    
                // Cálculo de x e y
                // Vezes 2 porque a grelha é de 0,5
                // Se for grelha 00-11, pode prescindir-se de x0 e y0 substituindo por:
                // x = px-Math.round(px)
                // y = py-Math.round(py)
    
                x = (px - x0) * 2;
                y = (py - y0) * 2;
                                       
                 // Valores de precipitação em mm
                f01 = 5;
                f11 = 3;
                f00 = 2;
                f10 = 1;
    
                // Cálculo de f(x,y)
                fp = (f00 * (1 - x) * (1 - y)) + (f10 * x * (1 - y)) + (f01 * (1 - x) * y) + (f11 * x * y);
    
                // 
                // Resultado f(x,y)
                // fp = 2.20920000000001
                // 





    Também passei para código a outra fórmula completa que envolve mais cálculos mas não tem a limitação acima referida da fórmula simplificada. A abordagem já é um pouco diferente:

    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]


    O código é este:

    Código:
                // x Longitude
                // y Latitude
    
                double fp, x, y, x1, x2, y1, y2;
                double q12, q22, q11, q21;
                double r1, r2;
    
                x1 = -9.5;
                x2 = -9.0;
                y1 = 38.5;
                y2 = 39.0;
    
                x = -9.13;
                y = 38.71;
    
                // Valores de precipitação em mm
    
                q12 = 5;
                q22 = 3;
                q11 = 2;
                q21 = 1;
    
                // Cálculo de r1
                // r1=(x,y1)
                r1 = (((x2 - x) / (x2 - x1)) * q11) + (((x - x1) / (x2 - x1)) * q21);
    
                // Cálculo de r2
                // r2=(x,y2)
                r2 = ((x2 - x) / (x2 - x1) * q12) + ((x - x1) / (x2 - x1) * q22);
    
                // Cálculo de fp
                fp = ((y2 - y) / (y2 - y1) * r1) + ((y - y1) / (y2 - y1)) * r2;
    
                // 
                // Resultado 
                // fp = 2.20920000000001
                // 
     
  11. rozzo

    rozzo
    Expand Collapse
    Staff

    Registo:
    11 Dez 2006
    Mensagens:
    1,902
    Local:
    Lisboa
  12. HotSpot

    HotSpot
    Expand Collapse
    Cumulonimbus

    Registo:
    20 Nov 2006
    Mensagens:
    3,613
    Local:
    Moita, Setubal
    Tks Vince e Rozzo. Acho que assim já me safo :thumbsup:

    Vou começar a pôr em prática.
     
    Collapse Signature Expand Signature
  13. rozzo

    rozzo
    Expand Collapse
    Staff

    Registo:
    11 Dez 2006
    Mensagens:
    1,902
    Local:
    Lisboa
    Sim, a formulação mais complicada só seria necessário numa malha não regular, em que seria preciso especificar todas as longitudes e latitudes, no caso da malha regular (o vosso) basta o caso simples e tá feito
     

Partilhar esta Página