Cálculo de ponto num Triangulo Recto

HotSpot

Cumulonimbus
Registo
20 Nov 2006
Mensagens
3,614
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.

triangulorecto.png


Obrigado desde já.
 


David sf

Moderação
Registo
8 Jan 2009
Mensagens
5,241
Local
Oeiras / VN Poiares
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.

triangulorecto.png


Obrigado desde já.

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.
 

rozzo

Moderação
Registo
11 Dez 2006
Mensagens
2,487
Local
Alcochete/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!
 

Vince

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..

exemplo.gif


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

rozzo

Moderação
Registo
11 Dez 2006
Mensagens
2,487
Local
Alcochete/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..
 

HotSpot

Cumulonimbus
Registo
20 Nov 2006
Mensagens
3,614
Local
Moita, Setubal
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..

exemplo.gif


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

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
 

rozzo

Moderação
Registo
11 Dez 2006
Mensagens
2,487
Local
Alcochete/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á? ;)
 

rozzo

Moderação
Registo
11 Dez 2006
Mensagens
2,487
Local
Alcochete/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!
 

Vince

Furacão
Registo
23 Jan 2007
Mensagens
10,624
Local
Braga
Rozzo, não tenho matemática há 15 anos. É complicado olhar para "letras" em vez de números.

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.

1831a0c3c97e1a3deaa44f6.png


13666933.gif
37761085.gif





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:

bilinearinterpolation.png

18074304.png

615b1d72be3a6ebd451d552.png

66236318.png



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
            //
 

rozzo

Moderação
Registo
11 Dez 2006
Mensagens
2,487
Local
Alcochete/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