Reconhecimento de expressões C - Sistema para cálculos matemáticos

17 respostas
matheuslmota

Caros, estou desenvolvendo um sistema em C que resolve problemas de integração e equações diferenciais básicas. O problema é que eu não sei uma forma intelignete de pegar uma sring que representa uma expressão e separá-la em parâmetro para as imnhas funções.
Tipo:

df/dx + x = 3

uma equação diferencial simples. Como eu faço para ler a equação a partir do console?
Leio a string inteiro e a separo em parte? Como eu faço isso?
Ou leio os parâmetros da equação separadamente pelo console.
Qual é a melhor forma?
Algum amigo poderia me dar ideias?

17 Respostas

E

Você precisa resolver equações diferenciais e integrações simbólicas? Escolha outra linguagem como Scheme. Ou precisa só fazer o processamento numérico?

matheuslmota

Só o processamento numérico.

E

Se for obter os parâmetros como uma fórmula, você precisa efetuar um “parse” dessa fórmula - é mais bonitinho, é claro, mas dá bastante trabalho. Provavelmente é mais fácil você ler os parâmetros separadamente (e listar quais são as , em vez de aceitar qualquer fórmula.

Para efetuar um parse, você pode usar um analisador léxico (procure por “flex” ou “lex”) e provavelmente um analisador sintático (procure por “bison” ou “yacc”). É claro que existem outros “compiler-compilers” por aí. Esses são os mais antigos.

matheuslmota

Eu dei uma rápida olhada no google e vi sobre o lex. Ele é usado em conjunto com o yacc, certo? Eu já suspeitava de ter de mexer com analisador léxico. Ele é complicado de mexer? Digo, eu terei que realizar muitas configurações nele para ele mapear corretamente as expressões matemáticas? Grato pela atenção.

E

Pois é, não sei exatamente como serão suas expressões. E mais uma coisa: você vai aceitar multiplicações implícitas e outras coisas que são meio chatinhas? Qual é a diferença entre o ponto (ou vírgula decimal) e o operador de multiplicação? Ou para multiplicação você só aceitará o “*” e a multipllicação implícita?

3x + y = 0

4.5x - 3.45y = 2.34E+23

Por causa dessas coisas chatinhas é que é bom definir direitinho sua gramática.

matheuslmota

Não, usar multiplicação implícita é suicidio. Eu iria colocar um padrão para receber a string, se eu for usar uma analisador léxico eu irei definir um modelo bem rígido de expressão. O uso do lex com o yacc é então viável para o meu caso?

E

Uma coisa interessante no yacc/bison é que se pode definir a precedência de operadores e se eles são associativos à esquerda e à direita.

http://dinosaur.compilertools.net/bison/bison_8.html#SEC71

edu_fernandes

Se usar pilhas também funciona.
Porém uma solução interessante é usando árvores.
Acredito que vai dar um trampo, porém fica interessante seu código, sem contar que tu vai somar conhecimento pra caramba a respeito.

Mas cara. Parabéns pela iniciativa.
Muito legal a idéia e bastante interessante.

Espero ter ajudado.
Abraço e boa sorte com o projeto.

matheuslmota

Opa edu_fernandes, obrigado. :smiley:
Eu tive pensando nessa possibilidade também.
Acho que o analisador léxico é bem interessante, deixa a aplicação mais completa. Quando eu terminar eu vou postar o código.
O intuito é me ajudar com alguns problemas da faculdade.

edu_fernandes

Ah sim entendi.
A preguiça de fazer exercícios de matemática somado a vontade de programar resultou nesse projeto.
Tá certo.

matheuslmota

Não edu_fernandes você me entendeu mal. Eu não tenho preguiça de fazer exercícios, mas na disciplina de eletromagnetismo aqui da faculdade tem questões que necessitam de complexas equações vetoriais, transformadas de fourier, integrais triplas, que embora eu saiba resolver, não é o foco da disciplina. Por exemplo, eu tô no meio de uma questão e eu me deparo com uma equação diferencial grande. Ao invés de eu perder o foco da questão resolvendo uma conta grande, eu pegaria logo o resultado da conta e aplicaria na minha questão. Assim eu veria se meu raciocínio estaria certo. É claro que não é preguiça minha, eu só quero é simplificar minha vida. E lógico, para projetar um sistema de tal complexidade eu teria que ter o total domínio da matemática usada, coisa que eu tenho. Experimenta estudar eletromagnetismo e verá que o que eu tô planejando é interessante. Obrigado por desmerecer meu projeto.

edu_fernandes

Não Matheus. Você me entendeu mal.
Escrevi essas palavras mas com uma gargalhada ecoando aqui em casa.
Não estou desmerecendo o projeto de forma alguma. Longe de mim fazer isso.
Foi uma brincadeira que fiz, apenas, mas você interpretou errado.
Claro que para fazer um programa assim você tem que dominar a matemática em questão.
Pode ficar tranquilo.
Se depender da minha torcida esse projeto já deu certo.
De qualquer forma, me pordoe por te-lo ofendido, não foi, nem de longe, minha intensão.

Abraço.

E

Matheus, por acaso você não pode usar o Mathematica ou o MatLab? Essas são ferramentas essenciais de gente que lida com matemática. Até conseguir fazer seu sistema de equações diferenciais funcionar direitinho vai comer muita poeira. (É claro que você vai apanhar bastante adaptando as bibliotecas que implementam esses algoritmos em C, é claro. Não acho que você vá implementar também essas bibliotecas. )

matheuslmota

Ok, então, vou usar suas ideias e a do entanglement no meu projeto. Acho que dentro de um mês ou dois eu faço isso ai eu posto o resultado para todos aqui no guj. Obrigado e desculpa o mal entendido. :lol:

matheuslmota

entanglement, não tinha visto seu post. Aqui eu costumo usar o scilab que é free, mas eu queria desenvolver uma ferramenta própria. Eu tenho vontade de fazer isso há muito tempo, e agora eu vou começar a desenvolver. Claro que eu vou começar com algo simples, tipo equações diferenciais básicas e integração numérica. Depois eu posso ir acrescentando outras funcionalidades. Eu sei que vai ser muito trabalhoso, mas eu vou achar muito interessante fazer isso. Além do mais eu já tenho muitas ideias prontas e eu estava esbarrando no problema da leitura da expressão. Vou usar o lex com o yacc mesmo. Você acha ser tão complicado assim implementar as funções de cálculo?

E

Depende do que você quer fazer. Eu lembro, em particular, que resolver equações diferenciais numericamente é um bocadinho complicado, basta dar uma olhada neste artigo da Wikipedia:

É porque às vezes aparecem equações que são meio instáveis:

matheuslmota

Mas esses casos mais complicados eu posso deixar para abordar por ultimo. Começaria com casos elementares e depois, baseado na forma como eu os implementei, parto para os casos mais complicados. O caso das equações instáveis nem são tão comuns, não irão afetar meu sistema no começo. Mas obrigado por lembrar esse tópico por que eu precisarei implementá-lo no futuro.

Criado 22 de novembro de 2010
Ultima resposta 22 de nov. de 2010
Respostas 17
Participantes 3