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?
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
entanglement
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
entanglement
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=04.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
entanglement
Uma coisa interessante no yacc/bison é que se pode definir a precedência de operadores e se eles são associativos à esquerda e à direita.
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.
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
entanglement
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
entanglement
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.