Autor Tópico: Como calcular integral definida em C++  (Lida 11358 vezes)

Description:

0 Membros e 1 Visitante estão vendo este tópico.

Offline Cássio Alvarenga

  • Moderador
  • CNCMASTER
  • ******
  • Posts: 3429
  • Sexo: Masculino
    • www.vatech.ind.br
  • Cidade - UF: Belo Horizonte - MG
  • Profissão: Empresario / Engenheiro Mecânico
Como calcular integral definida em C++
« Online: 16 de Abril de 2013, 10:10 »
Amigos,

 Preciso de um modo eficaz de calcular em c++ a area de um grafico de aceleração de um motor de passo, desse tipo:

http://www.piclist.com/images/member/RB-ezy-Q33/MACH3MotorTuning.jpg
Como calcular integral definida em C++


Porem a aceleração e desaceleração não são uma função linear, portanto não forma uma reta como na figura, mas sim uma função exponencial que forma uma "parábola com o topo achatado" e não um trapézio.


Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderador
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Como calcular integral definida em C++
« Resposta #1 Online: 16 de Abril de 2013, 12:37 »

Existem várias maneiras de calcular uma integral de maneira numérica (por programa) em tempo real, a mais prática é através de uma soma de pequenos retângulos, que aproximam a área da curva. Deve se ter alguns cuidados para evitar a saturação do algoritmo, pois uma integral vai aumentando indefinidamente.

Offline Cássio Alvarenga

  • Moderador
  • CNCMASTER
  • ******
  • Posts: 3429
  • Sexo: Masculino
    • www.vatech.ind.br
  • Cidade - UF: Belo Horizonte - MG
  • Profissão: Empresario / Engenheiro Mecânico
Re:Como calcular integral definida em C++
« Resposta #2 Online: 16 de Abril de 2013, 22:46 »

Existem várias maneiras de calcular uma integral de maneira numérica (por programa) em tempo real, a mais prática é através de uma soma de pequenos retângulos, que aproximam a área da curva. Deve se ter alguns cuidados para evitar a saturação do algoritmo, pois uma integral vai aumentando indefinidamente.

Esse que é o problema, Da um "lag" grande se colocar a base do retangulo (que fica em contato com o eixo das abscissas) pequeno, as vezes da ate erro porque "estoura" o Double, se coloco a base ou pouco maior os resultados dão um desvio não aceitavel  :'(.

 Vou ver se trocando a curva por uma reta onde passe pelo centro da curva... vai sobrar uma area não contabilizada e uma área á mais, mas creio que se aproximar o valor dessas áreas ela chegam á quase se igualar e da uma aproximação aceitável.  Ai é só tirar pela área do trapézio.

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderador
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Como calcular integral definida em C++
« Resposta #3 Online: 16 de Abril de 2013, 23:05 »
Esse que é o problema, Da um "lag" grande se colocar a base do retangulo (que fica em contato com o eixo das abscissas) pequeno, as vezes da ate erro porque "estoura" o Double, se coloco a base ou pouco maior os resultados dão um desvio não aceitavel  :'(.

Não entendi o "lag".

A coisa é simples..., quando se calcula a área, a cada iteração se soma a altura da curva x largura (base), como a largura da base é constante, o que conta de fato é a altura da curva. Além disso, as iterações são feitas a intervalos de tempo regulares. Acho que deve estar havendo algum erro....

Vou ver se trocando a curva por uma reta onde passe pelo centro da curva... vai sobrar uma area não contabilizada e uma área á mais, mas creio que se aproximar o valor dessas áreas ela chegam á quase se igualar e da uma aproximação aceitável.  Ai é só tirar pela área do trapézio.

Ao invés de um retângulo, pode usar um trapézio.

Offline Cássio Alvarenga

  • Moderador
  • CNCMASTER
  • ******
  • Posts: 3429
  • Sexo: Masculino
    • www.vatech.ind.br
  • Cidade - UF: Belo Horizonte - MG
  • Profissão: Empresario / Engenheiro Mecânico
Re:Como calcular integral definida em C++
« Resposta #4 Online: 17 de Abril de 2013, 13:35 »

Não entendi o "lag".

Para se ter uma aproximação de área aceitável, a base do retângulo tem que ser bem pequena, quanto mais pequena melhor, porem mais lento é o calculo e o programa da uma "paradinha" para resolver o calculo e esse "lag" vai influenciar na usinagem, acho que o jeito vai ser mudar do ATMega328 para um circuito com maior poder de processamento, estou pensando no Cortex M3 (esqueci de mencionar que tudo o programa vai rodar em um microcontrolador não no PC).

Ao invés de um retângulo, pode usar um trapézio.


Não entendi, trocar os milhares de mini-retângulos por trapézios?

O que é eu pensei é o seguinte:

Na imagem anexa tem o gráfico velocidade x tempo (linha verde) nesta linha tem a aceleração do motor (curva exponencial) depois uma reta (velocidade constante) e depois a curva de desaceleração (oposta a curva de aceleração), meu objetivo é saber a área dentro da linha verde (para posteriormente calcular quantos joules foi embora nessa ai, mas essa parte não vem ao caso)

 Estou cogitando a possibilidade de transformar a curva exponencial em uma reta que cruze seu centro... Assim basta calcular a area de 2 triângulos e um retângulo que não vai fazer nem cocegas no chip.

 Porem parte da área vai ficar fora da soma (parte azul) e uma área vai ser somada á mais (parte amarela).

 Logicamente se a área amarela tiver um valor próximo da área azul, a aproximação do calculo vai ser aceitável. (talvez ate melhor que o método dos retângulos)

Capiche?
« Última modificação: 17 de Abril de 2013, 13:37 por Cássio Alvarenga »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderador
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Como calcular integral definida em C++
« Resposta #5 Online: 17 de Abril de 2013, 14:52 »
Em 99% das aplicações industriais, em controle PID por exemplo, onde há a ação integral, usa-se a integração em fatias, conforme a figura. Sendo que o algoritmo roda a intervalos precisamente regulares no tempo (a cada 10 ms, por exemplo), mas o intervalo dependerá do processo em tela.

Não entendi o seu gráfico, não seria aceleração x tempo? Se a sua intenção é integrar a aceleração, pelo menos, seria assim como desenhei, não é?

Lembrando que a integral da aceleração fornece a velocidade...
« Última modificação: 17 de Abril de 2013, 15:12 por minilathe »

Offline Cássio Alvarenga

  • Moderador
  • CNCMASTER
  • ******
  • Posts: 3429
  • Sexo: Masculino
    • www.vatech.ind.br
  • Cidade - UF: Belo Horizonte - MG
  • Profissão: Empresario / Engenheiro Mecânico
Re:Como calcular integral definida em C++
« Resposta #6 Online: 17 de Abril de 2013, 18:10 »
Em 99% das aplicações industriais, em controle PID por exemplo, onde há a ação integral, usa-se a integração em fatias, conforme a figura. Sendo que o algoritmo roda a intervalos precisamente regulares no tempo (a cada 10 ms, por exemplo), mas o intervalo dependerá do processo em tela.

 Infelizmente desse jeito da deixando o processo lento demais.

Citar
Não entendi o seu gráfico, não seria aceleração x tempo? Se a sua intenção é integrar a aceleração, pelo menos, seria assim como desenhei, não é?

O grafico é de Velocidade x tempo,  A aceleração só estará presente quando a reta tangente á qualquer ponto do grafico for diferente de zero, no caso das bordas, já no meio a VELOCIDADE é constante.

Lembrando que a integral da aceleração fornece a velocidade...

 Minha intenção é calcular o trabalho exercido. Integrando a velocidade x tempo.

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderador
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Como calcular integral definida em C++
« Resposta #7 Online: 17 de Abril de 2013, 19:39 »
Em 99% das aplicações industriais, em controle PID por exemplo, onde há a ação integral, usa-se a integração em fatias, conforme a figura. Sendo que o algoritmo roda a intervalos precisamente regulares no tempo (a cada 10 ms, por exemplo), mas o intervalo dependerá do processo em tela.

 Infelizmente desse jeito da deixando o processo lento demais.

Lento?? Se o cálculo de cada fatia for feito a cada 1 ms, a cada 1 ms terás um resultado da integral, está bom? Pode ser mais rápido também. Ou seja, depende da fatia de tempo da integral. O que é lento para você?

O grafico é de Velocidade x tempo,  A aceleração só estará presente quando a reta tangente á qualquer ponto do grafico for diferente de zero, no caso das bordas, já no meio a VELOCIDADE é constante.

Acho que há algumas nuvens no ar....

Se o gráfico é de velocidade x tempo, a integral fornece a distância percorrida, certo?

A derivada desse gráfico (a derivada da velocidade) fornece a aceleração, você quer a derivada ou a integral?

Minha intenção é calcular o trabalho exercido. Integrando a velocidade x tempo.

O trabalho exercido (Joules) pode ser calculado pela integração da potência no motor (integral do produto Torque x Velocidade).

A integral da velocidade x tempo fornece a distância percorrida.

Você também pode calcular aproximadamente o trabalho exercido através da integração da potência elétrica consumida pelo motor, como num "relógio de luz", descontando o rendimento do motor, que você pode medir através de testes.
« Última modificação: 17 de Abril de 2013, 19:46 por minilathe »

Offline Cássio Alvarenga

  • Moderador
  • CNCMASTER
  • ******
  • Posts: 3429
  • Sexo: Masculino
    • www.vatech.ind.br
  • Cidade - UF: Belo Horizonte - MG
  • Profissão: Empresario / Engenheiro Mecânico
Re:Como calcular integral definida em C++
« Resposta #8 Online: 17 de Abril de 2013, 20:58 »
Lento?? Se o cálculo de cada fatia for feito a cada 1 ms, a cada 1 ms terás um resultado da integral, está bom? Pode ser mais rápido também. Ou seja, depende da fatia de tempo da integral. O que é lento para você?

  Quando calcula a integral por definição numérica, o programa da uma parada de quase 1 segundo. (estou usando a base do retangulo 1e-7).

Citar
Se o gráfico é de velocidade x tempo, a integral fornece a distância percorrida, certo?


Exato, eu já sei qual é o momento binário, para saber o trabalho basta saber a distância, não é?


Citar

Você também pode calcular aproximadamente o trabalho exercido através da integração da potência elétrica consumida pelo motor, como num "relógio de luz", descontando o rendimento do motor, que você pode medir através de testes.

O X da questão é o rendimento do motor  :). O dispositivo que estou trabalhando é justamente para calcular o rendimento, ou melhor dizendo eficiência em diferentes regimes de trabalho.



Offline styg

  • Fuso
  • **
  • Posts: 123
  • Sexo: Masculino
  • GUIA-CNC
Re:Como calcular integral definida em C++
« Resposta #9 Online: 17 de Abril de 2013, 21:35 »
Cassio, seria interessante dar mais detalhes sobre a parte prática também e não só teoria.
Tá rodando isso em alguma placa ou só simulando? Qual MCU? Qual frequencia? C ou C++? Tu que ta programando? Como voce detecta o "lag" (debug?)?
Recomendo fazer como o minilathe falou, fatiar a curva em várias retas para simplificar, reduzindo bastante a fatia vai dar boa precisão e vai ser bem mais rápido o cálculo.
Dá mais detalhes da aplicação.

Offline Cássio Alvarenga

  • Moderador
  • CNCMASTER
  • ******
  • Posts: 3429
  • Sexo: Masculino
    • www.vatech.ind.br
  • Cidade - UF: Belo Horizonte - MG
  • Profissão: Empresario / Engenheiro Mecânico
Re:Como calcular integral definida em C++
« Resposta #10 Online: 17 de Abril de 2013, 22:07 »
Tá rodando isso em alguma placa ou só simulando? Qual MCU? Qual frequencia? C ou C++? Tu que ta programando? Como voce detecta o "lag" (debug?)?
Recomendo fazer como o minilathe falou, fatiar a curva em várias retas para simplificar, reduzindo bastante a fatia vai dar boa precisão e vai ser bem mais rápido o cálculo.
Dá mais detalhes da aplicação.

é em C++ utilizando um chip ATMega328p
O programa faz a leitura de um movimento colendo dados do mesmo e depois processando para fornecer as informações logo depois deste movimento, percebi o "lag" quando implementei o codigo para calcular a integral, porem ele faz certinho no primeiro movimento, no segundo movimento em diante o sistema não recebe o começo do movimento, é como se ele tivesse parado cerca de 1 segundo calculando a integral para depois receber os dados dos sensores.

 Entendeu? (não sei se fui claro)

 Já pensei na solução: Primeiro vou colher todos os dados de TODOS movimentos e DEPOIS vou processa-los para só então exibir.

 do jeito que estou fazendo, diga-se "em tempo real": Ler sensores -> processa os dados -> print dos resultados... logo depois do movimento  esta atrasando o "ler sensores" do próximo movimento.

 Vai ser assim agora: "ler sensores e salva" isso pra cada movimento, DEPOIS vou processar do jeito comum (como o gil falou) e então só depois exibir.

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderador
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Como calcular integral definida em C++
« Resposta #11 Online: 17 de Abril de 2013, 22:41 »

Os sistemas de tempo real mais simples executam repetidamente um laço do tipo:
(1) ler entradas, em seu caso, ler a aceleração ou a velocidade
(2) integrar a medição
(3) mostrar o resultado
(4) incrementar variáveis (de tempo, contadores, ...)

Há também os sistemas concorrentes e multitarefa, mais complexos, que fazem várias coisas ao mesmo tempo, ler entradas, calcular, atualizar saídas, ....

Mas, se você quer apenas analisar depois do ocorrido, ou como se diz, "comentar o vídeo tape do jogo", é bem mais fácil armazenar tudo a processar depois. Apesar de gastar mais memória de dados, a vantagem dessa abordagem é que pode aplicar vários algoritmos e comparar os resultados obtidos. Mas, com as baratas memórias SD, Mini-SD, ... de vários GB, isso é "molezinha" para um ATMega.

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderador
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Como calcular integral definida em C++
« Resposta #12 Online: 17 de Abril de 2013, 23:11 »
Lento?? Se o cálculo de cada fatia for feito a cada 1 ms, a cada 1 ms terás um resultado da integral, está bom? Pode ser mais rápido também. Ou seja, depende da fatia de tempo da integral. O que é lento para você?

  Quando calcula a integral por definição numérica, o programa da uma parada de quase 1 segundo. (estou usando a base do retangulo 1e-7).

Realmente, ainda não entendi a tal lentidão...

Citar
Se o gráfico é de velocidade x tempo, a integral fornece a distância percorrida, certo?


Exato, eu já sei qual é o momento binário, para saber o trabalho basta saber a distância, não é?

E se é um motor de passo que não perde passos, a distância é proporcional a quantidade de passos aplicada ao driver, que você pode totalizar facilmente com um contador. Complica um pouquinho se levar em conta os sinais de passo e direção num dados eixo. Além disso, em movimentos compostos (z,y,z), tem que calcular a distância efetivamente percorrida (vetor deslocamento tridimensional) e força na direção do deslocamento (vetor força tridimensional).

Por isso, acho que integrar o produto torque instantâneo do motor x velocidade instantânea seja mais preciso. Explicando, o torque (unidimensional) é mais facilmente mensurável e a velocidade (unidimensional) pode ser determinada através da frequência instantânea de pulsos ao driver. Além disso, como a velocidade do motor muda menos frequentemente do que a distância percorrida, o resultado deve ser mais preciso usando velocidades. Se somar as potências em cada eixo motriz obtêm-se a potência total do movimento tridimensional.

Ainda é uma aproximação, pois há as perdas nos fusos, patins e acoplamentos.

O X da questão é o rendimento do motor  :). O dispositivo que estou trabalhando é justamente para calcular o rendimento, ou melhor dizendo eficiência em diferentes regimes de trabalho.

Acho que se você determinar numa bancada de testes o rendimento do motor para cada regime de operação (torque x velocidade), poderia aplicar esse rendimento modelado a partir do torque e da velocidade medidas. Assumindo que o rendimento do motor não varie muito, a menos um motor mais antigo, mas aí é só medir o rendimento de novo.

 

/** * */