Página 1 de 1

Interpolação de Matriz

MensagemEnviado: 17 Ago 2008 23:13
por ktulu
Boa noite,

Estou quebrando a cabeça aqui tentando lembrar como que se faz interpolação de pontos em uma matrix.

Estou montando uma injeção eletronica bem básica pra um jipe e pra otimizar os pontos de calibracao quero otimizar a tabela.
Entao eu tenho uma matriz 10 x 10 onde o eixo X representa Carga e o Y Rotacao. Digamos que cada eixo vai de 10 a 100%, como que eu faço pra interpolar o ponto referente a 13% de carga e 78% de rotacao?

Matrix exemplo:

RPM/RL
. . . . .10% 20%
70% . 40 . 55
80% . 45 . 70

Nao estou conseguindo chegar a uma formula simples que nao use muito processamento pois utilizo um PIC rodando a 20Mhz e tempo de processamento é meio crítico nessa aplicação.

Abracos.

Re: Interpolação de Matriz

MensagemEnviado: 18 Ago 2008 09:31
por andre_luis
ktulu,

Já usei o MATLAB para gerar uma curva em função dos pontos adquiridos, e em seguida, com a função obtida, gerar a tabela de valores.

No final, utilizei somente 2 funçoes. É bem simples.

+++

Re: Interpolação de Matriz

MensagemEnviado: 18 Ago 2008 21:55
por ktulu
andre_teprom escreveu:ktulu,

Já usei o MATLAB para gerar uma curva em função dos pontos adquiridos, e em seguida, com a função obtida, gerar a tabela de valores.

No final, utilizei somente 2 funçoes. É bem simples.

+++


Mas o problema é que eu nao posso gravar a funcao no processador. Essa matriz é alterada pra se mudar a calibracao, e nao tem como ficar gerando uma funcao dela inteira toda vez que eu alterar um valor.
Será que isso é tao complexo assim ou eu fiquei meio burro?

Re: Interpolação de Matriz

MensagemEnviado: 19 Ago 2008 00:15
por andre_luis
Bom, se a matriz é fixa e não exige recalibração, uma simples tabela de constantes, resolve. ( lookup-table )

Ok, mas se isso tem de ser gerado dinamicamente tem de ser resolvido não por fórmula, mas por função com iterações sucessivas.

Isso envolve calculos com divisão, que consomem um tempo enorme de processamento. E pra piorar, os exemplos obtidos na web utilizam float. Esse abaixo, só utiliza double . Talvez ajude.

http://oreilly.com/catalog/masteralgoc/chapter/ch13.html


+++

Re: Interpolação de Matriz

MensagemEnviado: 19 Ago 2008 23:03
por ktulu
andre_teprom escreveu:Bom, se a matriz é fixa e não exige recalibração, uma simples tabela de constantes, resolve. ( lookup-table )

Ok, mas se isso tem de ser gerado dinamicamente tem de ser resolvido não por fórmula, mas por função com iterações sucessivas.

Isso envolve calculos com divisão, que consomem um tempo enorme de processamento. E pra piorar, os exemplos obtidos na web utilizam float. Esse abaixo, só utiliza double . Talvez ajude.

http://oreilly.com/catalog/masteralgoc/chapter/ch13.html


+++


André,
obrigado pela dica e pelo link.
Preciso perder algumas horas pra ver como aplicar aquilo no meu projeto. Lembro pouco do que aprendi na faculdade sobre esses metodos de newton pra resolucao de sistemas.
Mas vou ver isso com calma no final de semana e quando eu conseguir algo dou um feedback aqui.

abraco

MensagemEnviado: 22 Ago 2008 05:52
por joao
Veja se é isso que vc está procurando:


matriz original:
int M[10][10] = {.....};


Agora, tentando achar o valor entre 13% em X e 78% em Y
Código: Selecionar todos
    10  11  12  13  14  15  16  17  18  19  20

70  40                                      55

71  40                                      56
 
72  41                                      58

73  41                                      59

74  42                                      61
 
75  42                                      62

76  43                                      64

77  43                                      65

78  44  46  48  50                          67

79  44                                      58

80  45                                      70


1 - Calcula-se a primeira coluna:
((45-40)/10 * posi) +40 // Posi é a posicao que vc está calculando

2 - Calcula-se a ultima coluna
((70-55)/10 * posi) +55 // Posi é a posicao que vc está calculando

3 - Calcular o ponto que vc realmente quer
((67-44)/10 * posi) +44

5 - Juntando tudo:
Código: Selecionar todos
  int posiX = 13; // VC recebe esse valor, só estou usando o que vc passou
  int posiY = 78; // VC recebe esse valor, só estou usando o que vc passou

  int MenorPosiColuna = posiY - (posiY % 10); // Neste exemplo será 70
  int MaiorPosiColuna = MenorPosiColuna + 10; // Neste exemplo será 80
  int MenorPosiLinha  = posiX - (posiX % 10); // Neste exemplo será 10
  int MaiorPosiLinha  = MenorPosiLinha + 10;  // Neste exemplo será 20

  int MenorValorColuna1 = M[MenorPosiLinha][MenorPosiColuna]; // Neste exemplo será 40
  int MaiorValorColuna1 = M[MenorPosiLinha][MaiorPosiColuna]; // Neste exemplo será 45
  int MenorValorColuna2 = M[MaiorPosiLinha][MenorPosiColuna]; // Neste exemplo será 55
  int MaiorValorColuna2 = M[MaiorPosiLinha][MaiorPosiColuna]; // Neste exemplo será 70

  int PrimeiraColuna = ((MaiorvalorColuna1 - MenorValorColuna1)/10 * (posiY % 10)) + MenorValorColuna1; // Neste exemplo será 44
  int UltimaColuna   = ((MaiorvalorColuna2 - MenorvalorColuna2)/10 * (posiY % 10)) + MenorvalorColuna2; // Neste exemplo será 67

  int value =  ((UltimaColuna - PrimeiraColuna)/10 * (posiX % 10)) + PrimeiraColuna;  // Neste exemplo será 50




6 - Comentários:

Primeira coluna é o calculo feito no item 1, mas agora dinamico
Ultima Coluna é o calculo feito no item 2, mas agora dinamico
value é o calculo feito no item 3, mas agora dinamico. Value deve ser o valor que vc está procurando.
Coluna1 é a coluna mais a esquerda(com valores entre 40 e 45) e coluna2 é a coluna mais a direita(com valores entre 55 e 70).

[]'s

MensagemEnviado: 22 Ago 2008 07:57
por fabim
katulu

Entao eu tenho uma matriz 10 x 10 onde o eixo X representa Carga e o Y Rotacao. Digamos que cada eixo vai de 10 a 100%, como que eu faço pra interpolar o ponto referente a 13% de carga e 78% de rotacao?



se a matriz é de valor inteiro de 10 e 10....
Como voce conseguiu 13% e 78% ? <<
Este 13% e 78%, serão usados em cruzamento para pegar um 3° valor ?

Se sim, seus problemas acabarium.
Calculo polinomial. Baixa no Emula ORIGIN PRO.

"pelo que eu entendi voce quer criar um array de 10 X 10 bytes, onde cada byte vai sempre ser carregado com valores diferentes /;?

Fabim

MensagemEnviado: 23 Ago 2008 19:10
por Djalma Toledo Rodrigues
Sou leigo em injeção eletrônica
Mas, eu pensava que RPM fosse em função da posição do acelerador .
Que a função da injeção eletrônica fosse o controle da quantidade de combustível injetado para a proporção correta da mistura ar/combustível, dai os sensores de Pressão Atmosférica , de Temperaturado Ar e da analise dos gases de escapamento através da Sonda de Oxigênio.
Não é isso não ?
.

MensagemEnviado: 24 Ago 2008 18:51
por ktulu
Joao,

Era exatamente isso que eu procurava. Coloquei no meu codigo e ficou certinho. Tá pegando valores bem plausíveis.
Muito obrigado.

Fabim,

A rotacao e carga vem de sensores, e nao vem inteiros. Eu preciso entrar com rotacao e carga em uma tabela e pegar o valor da quantidade de combustivel que sera injetado com base nisso. Essa tabela é de valores pré-calibrados. Quanto maior a matrix mais pontos de calibracao eu tenho, mas como é uma injeção bem simples vou fazer apenas com 10x10 pontos. Já é o necessário pra funcionar.
Essa matriz vai ser atualizada somente durante a calibracao do veiculo. Depois ela é travada.

Djalma,

RPM não é em função da posicao do acelerador. Quando voce pisa no pedal do acelerador voce abre a borboleta, variando apenas a quantidade de ar que está entrando no motor. Sabendo a quantidade de ar que entra no motor voce pode calcular a quantidade de combustivel necessaria e assim injetar. Rotaçao é consequencia nessa funcao.
Voce está certo, a injecao calcula a quantidade de combustivel necessaria atraves de varios sensores.