Cálculo de Integrais Definidas usando Delphi

Delphi

04/09/2003

Alguém tem alguma idéia de como seria o código fonte para fazer o cálculo de uma Integral Definida? De alguma forma passar uma expressão deste tipo para uma função:


e a função retorna o resultado, que no caso seria 2. Não tenho nem idéia de como seria a função ou o que passar como parâmetro. Qualquer idéia seria útil.

Desde já agradeço...


Akelle Kara

Akelle Kara

Curtidas 0

Respostas

Afarias

Afarias

04/09/2003

Vc ja leu algum livro sobre CALCULO NUMERICO ?? se nao, melhor comecar por ai.


T+


GOSTEI 0
Akelle Kara

Akelle Kara

04/09/2003

Vc ja leu algum livro sobre CALCULO NUMERICO ?? se nao, melhor comecar por ai. T+


Acho vou ter isso o ano que vem na facu...

Acho melhor simplificar um pouco a pergunta: Como eu passo a expressão para a função? A parte de calcular eu já tive uma idéia mais ou menos, vou usar um loop para calcular o limite da soma de Riemann e obter o resultado, mas ainda falta uma forma de passar a expressão para a função...


GOSTEI 0
Fernando Lempê

Fernando Lempê

04/09/2003

Use um software feito somente pra isso

o nome é mapple

ele calcula limite derivada e integral entre outras coisas


GOSTEI 0
Wbb

Wbb

04/09/2003

Você não precisa passar a expressão. Basta passar o valor de X e pronto. Na função em que você colocar a expressão, ai sim utilize o valor de X.

wbb


GOSTEI 0
Akelle Kara

Akelle Kara

04/09/2003

Você não precisa passar a expressão. Basta passar o valor de X e pronto. Na função em que você colocar a expressão, ai sim utilize o valor de X. wbb


A minha intenção é usar qualquer expressão com uma única função (assim o usuário podeira digitar a função durante a execução do programa), e a função que resolveria a integral se encarregaria de substituir x pelos valores adequados e fazer os devidos cálculos até que seja obtido um resultado satisfatório para a integral (pois calcular o valor exato seria muito mais complicado).


GOSTEI 0
Cebikyn

Cebikyn

04/09/2003

Já passei funções de uma variável para uma função do Delphi quando fiz um visualizador de gráficos. Basta usar um código fonte que efetue expressões numéricas e quando for passar a string, substitua x por um valor adequado (veja um link no fim do tópico). Depois é só fazer a parte do cálculo: crie uma variável do tipo float e associe a ela um y calculado para um valor de x próximo ao limite inferior de integração (ex: 0,0005) depois pegue dois valores de x equidistantes do valor que vc escolheu (ex: 0,0004 e 0,0006), ache a diferença entre eles (0,0002) e multiplique pelo y. Repita a operação em um loop e vá somando os valores obtidos e aumentando os valores de x linearmente (o próximo valor seria 0,0007 e os valores equidistantes seriam 0,0006 e 0,0008) até que x tenha um valor bem próximo do limite superior de integração (no seu exemplo: 3,141592654...). Quanto menores os números escolhidos inicialmente mais preciso será o resultado (tente trabalhar com todas as 15 casas decimais do tipo float, vai demorar mais, mas vc terá um resultado bastante preciso).

No seu exemplo vc usa uma integral imediata, neste caso vc também poderia programar uma tabela de integrais imediatas e fazer um algoritmo para encontrar a primitiva da função e aí calcular num dado intervalo (neste caso vc obteria um resultado exato e não apenas aproximado como é o caso da soma de Riemann, mas o código seria um pouco mais complexo).

Simples, não? :D

A solução do [b:8e3c53b444]wbb[/b:8e3c53b444] também é boa, mas no caso em que a expressão pode variar, vc teria que usar [i:8e3c53b444]scripting[/i:8e3c53b444], o que daria mais flexibilidade ao seu programa, mas vc perderia um pouco na facilidade de uso.

Você pode encontrar um código que efetua expressões numéricas em:
http://www.delphi3000.com/articles/article_1322.asp

Innerfuse Pascal Script - Para adicionar [i:8e3c53b444]scripting[/i:8e3c53b444] ao seu programa:
http://www.carlo-kok.com/ifps3.php

Eu ainda acho bem mais legal calcular essas coisas usando lápis e papel...


GOSTEI 0
Carnette

Carnette

04/09/2003

Na SQLMAGAZINE numero 6 existe um artigo interessante sobre Algebra Relacional


GOSTEI 0
Akelle Kara

Akelle Kara

04/09/2003

Muito obrigado a todos.
Depois das sugestões, consegui o seguinte código:

function TForm1.CalcularIntegral(Funcao: String;
  LimiteInferior, LimiteSuperior, N: Extended;
  var Tempo:Integer): Extended;
var
  x, y: Extended;
  x1: Integer;
begin
  Tempo := GetTickCount;
  x := LimiteInferior + (N/2);
  MC.MathExpression :=
    FastReplace(edtExpressao.Text, ´x´, FloatToStr(x));
  y := MC.MathResult;
  Result := (y*N);
  ProgressBar1.Max := Trunc((LimiteSuperior-LimiteInferior)/(N));
  for x1:=0 to ProgressBar1.Max do
  begin
    x := x+N;
    MC.MathExpression :=
      FastReplace(edtExpressao.Text, ´x´, FloatToStr(x));
    y := MC.MathResult;
    Result := Result + (y*N);
    ProgressBar1.Position := x1;
    ProgressBar1.Update;
  end;
  Tempo := GetTickCount-Tempo;
end;

OBS:
[b:15c8fdf9c9]N[/b:15c8fdf9c9] é a norma de uma partição (deve ser um número próximo de 0).
[b:15c8fdf9c9]MC[/b:15c8fdf9c9] é um componente TMathControl, que esta no link do Cebikyn
[b:15c8fdf9c9]FastReplace[/b:15c8fdf9c9] é uma função que faz parte da FastStrings.pas.

E funcionou de maneira aceitável:
[b:15c8fdf9c9]1,9997926...[/b:15c8fdf9c9] é bem próximo de [b:15c8fdf9c9]2[/b:15c8fdf9c9], que é o resultado exato, mas o problema mesmo é o tempo de processamento, [b:15c8fdf9c9]9s[/b:15c8fdf9c9] para [b:15c8fdf9c9]N=0,0002[/b:15c8fdf9c9] (imaginem se eu usasse ´todas as 15 casas decimais´ como sugeriu o cebikyn, levaria horas...). E apresentou alguns problemas para funções com imagem negativa e também funções racionais, mas funciona muito bem para as outras.


GOSTEI 0
Cebikyn

Cebikyn

04/09/2003

Encontrei um pseudo compilador de expressões que reduz em até 50¬ o tempo de processamento do seu código:

http://www.dow.wau.nl/aew/ParseExpr.html

O TExpressionParser trabalha com variáveis na expressão, logo elimina a necessidade de usar o FastReplace. E ele também é bem flexivel e vc pode acrescentar mais funções além daquelas que já vem implementadas, eu já acrescentei mais doze funções no meu (cossecante, secante, cotangente, as respectivas funções inversas e as correspondentes hiperbólicas, incluindo inversas hiperbólicas). Qq coisa deixe uma msg.


GOSTEI 0
POSTAR