Fórum Cálculo de Integrais Definidas usando Delphi #179808
04/09/2003
0
[img:81b447ce55]http://www.kosmud.hpg.ig.com.br/other/pics/integral.gif[/img:81b447ce55]
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
Curtir tópico
+ 0Posts
04/09/2003
Afarias
T+
Gostei + 0
04/09/2003
Akelle Kara
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
04/09/2003
Fernando Lempê
o nome é mapple
ele calcula limite derivada e integral entre outras coisas
Gostei + 0
04/09/2003
Wbb
wbb
Gostei + 0
04/09/2003
Akelle Kara
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
04/09/2003
Cebikyn
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
04/09/2003
Carnette
Gostei + 0
05/09/2003
Akelle Kara
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:
[img:15c8fdf9c9]http://www.kosmud.hpg.ig.com.br/other/pics/screen_shot.gif[/img:15c8fdf9c9]
[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
20/09/2003
Cebikyn
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
Clique aqui para fazer login e interagir na Comunidade :)