You are on page 1of 3

VE DE ÁLGEBRA LINEAR 1 E IC 1

O objetivo do trabalho é construir um programa capaz de estimar a posição de um alvo em um terreno, a partir do
conhecimento de medições fornecidas por n radares. Cada radar é capaz de fornecer a própria latitude, longitude e
a direção do alvo, codificada na forma de um vetor unitário do plano, que aponta para o alvo. Os radares são
incapazes de fornecerem a distância até o alvo. Estamos considerando também que, devido às limitações de
engenharia, as medições fornecidas apresentam imprecisões.

Ex:

A figura acima mostra 3 radares localizando um alvo, e ilustra o fato de que suas medições apresentam
imprecisões. Uma alternativa para lidar com a imprecisão e quantidade de medidas fornecidas é a utilização do
método dos mínimos quadráticos.

Para construir o programa pede-se que sejam implementadas as seguintes funções:

a) float a_transp_a( float a[2][2], float *x, float *y, int n );

Essa função recebe uma matriz A = [ x y ], de n linhas e 2 colunas, ou seja, x e y representam as duas colunas de
A. Ao ser chamada, deve ser retornado em a[2][2] o valor de . Object 1

b) void a_transp_b( float atb[2], float *x, float *y, int n );

Essa função recebe a matriz A, da mesma forma que o item anterior, e retorna em atb[2] o vetor definido por
Object 2
, onde b é um vetor de dimensão n, tal que todas suas componentes possuem valor 1.

c) float lin_solve( float r[2], float a[2][2], float b[2] );

Essa função retorna em r a solução do sistema linear Object 3


, onde A é dado pela matriz a[2][2] e b é dado
pelo vetor b[2].

d) void insert_line( float *x, float *y, int i, float pos[2], float dir[2] );

Essa função deve receber em pos[2] as coordenadas de latitude e longitude de um radar, e em dir[2] as
coordenadas da medição fornecida por ele. Como resultado da chamada da função, devem ser colocados em x[i]
e y[i] valores tais que, sendo a = x[i] e b = y[i], tenhamos como a equação da reta que
Object 5

passa pelo radar e cuja direção é a medição fornecida por ele. Ou seja, sendo , como definido no
Object 4

item a), tem-se que essa função especifica apropriadamente a i-ésima linha de A.

e) Adicione a seguinte função main( ) às funções definidas por você nos items anteriores. Leia essa função, e
entenda o que o programa faz:
int main( void )
{
float ata[2][2], atb[2];
float r[2], x[1000], y[1000], pos[2], dir[2];
int i, nradares;

scanf( "%i", &nradares );


for( i = 0; i < nradares; i++ ){
scanf( "%f%f%f%f", &pos[0], &pos[1], &dir[0], &dir[1] );
insert_line( x, y, i, pos, dir );
}

a_transp_a( ata, x, y, nradares );


a_transp_b( atb, x, y, nradares );
lin_solve( r, ata, atb );

printf( "Coordenada do Alvo:\n%f, %f", r[0], r[1] );


}

Pronto !!! Seu programa está completo agora vamos testá-lo !!!
f) A lista de valores abaixo corresponde às informações de 20 radares, que precisa ser passada para
seu programa estimar a posição de um alvo.
20
4.866398 2.700413 -0.269522 0.962994
4.876274 0.201553 -0.181030 0.983478
0.833843 7.614788 0.999980 -0.006358
8.632368 5.572530 -0.929943 0.367703
6.588511 0.463489 -0.376960 0.926229
1.797176 7.151463 0.964801 0.262982
7.623816 1.560028 -0.551488 0.834183
1.659821 9.138008 0.768865 -0.639411
7.030430 6.648807 -0.964704 0.263338
1.285347 7.126536 0.977304 0.211844
5.696925 6.749360 -0.933118 0.359570
5.815790 8.877946 -0.860177 -0.509995
5.968438 7.630244 -0.999993 0.003644
3.145547 8.826492 0.305121 -0.952314
4.133265 2.171890 -0.111330 0.993783
9.446834 0.694130 -0.641035 0.767512
2.320968 5.239624 0.464832 0.885399
6.468970 6.755063 -0.962898 0.269865
9.407033 6.776791 -0.990523 0.137349
0.976272 6.071567 0.859530 0.511085

Queremos neste item que você utilize seu programa para estimar o posicionamento do alvo a partir
das medições desses radares. Como você não aprendeu a manipular arquivos em Linguagem C,
explore o fato de que, no LINUX, é possível fazer com que a origem dos dados fornecidos para a
função scanf deixe de ser o teclado, e passe a ser um arquivo texto.
Mais precisamente, se o seu programa se chama “radares”, basta você salvar a lista de valores acima
em um arquivo dados.txt, e executar o programa digitando “./radares < dados.txt” para
que seu programa exiba as coordenadas estimadas do alvo.

g) Monte 5 arquivos, adaptando o arquivo utilizado no item anterior, de forma que, em cada um
deles sejam levados em consideração apenas a informação de um par de radares selecionado no
conjunto dos 20 radares fornecidos. Ou seja, encontre 5 soluções ingênuas, descartando parte da
informação dos radares para obter uma modelagem através de um sistema linear de duas linhas e
duas colunas.

h) Sabemos que a posição verdadeira do alvo especificado no item f) é (3.544889, 7.596040).


Determine a distância desta posição para as soluções estimadas nos itens f) e g).
Qual a sua conclusão ? Usar a redundância de informação fornecida pelos 20 radares em uma
abordagem de mínimos quadráticos foi vantajosa em relação a a abordagem ingênua de selecionar
aleatoriamente pares de radares para produzir sistemas lineares sem excesso de equações?

You might also like