23. oktober 2004 - 12:49Der er
17 kommentarer og 1 løsning
"Symbolsk matematik"
Understøtter Java "Symbolsk matematik" som f.eks. Mathematica, Maple, MATLAB etc. (CAS-systemer = Computer Algebra System'er) - altså algebraisk beregning (formler)i modsætning til numerisk bereging?
Egentlig lidt besynderligt. Så vidt jeg ved, kan man i Java regne med nærmest vilkårlig numerisk præcision, så jeg troede måske nogle havde kastet sig over den algebraiske/symbolske del også. Mon ikke det kommer på et tidspunkt (?)
Imens kan man da godt fundere over, hvordan man ville gribe noget sådant an. Man kunne overveje:
1) Implementering af alle fundamentale regneregler og funktioner (+, *, /, cos, sin, exp, log etc.) og (ikke mindst) sammensætninger af disse
2) Reduktion af formler ud fra regneregler, indtil reduktion ikke kan foretages yderligere
3) Repræsentationen i Java: Hvordan??
ad 2) Her er et interessant problem, hvor få regneregler der faktisk skal til for at en rimelig reduktion altid kan foretages.
Yderligere overvejelser: Reduktion ud fra en algoritme er ikke nødvendigvis entydig, idet rækkefølgen af reduktionen kan få betydning. F.eks. kunne man forestille sig, at reduktion af en funktion f(x) slutter med f(x)=x*x+2*x hhv. f(x)=x*(x+2) afhængig af rækkefølge. I praksis er dette nok ikke noget større problem, idet de to udtryk i en vis forstand nok er "lige gode".
Nogle overvejelser omkring pkt. 3)? Den simple tanke er vel, at formler repræsenteres i strenge, som så reduceres gennem en "parser" i Java, som igen returnerer en reduceret streng. Dette er umiddelbart ikke videre elegant. Alternativt kan en vilkårlig formel måske repræsenteres i en træ-lignende struktur. Det er vel sådan man vil gribe en reduktionsopgave an, hvis man bruger papir og pen - altså noget med at man starter udefra ved "bladene" i træet (svarende til indefra i formlen) og reducerer nedad i "grenene" modroden så langt man kan komme.
Eks. f(x)=exp((a+cos(b*c))/d) kan repræsenteres som:
--------a / + / \ b / \ / / cos--* / \ exp--% c \ -------------d
(% betegner her division)
Men blot at få opstillet en sådan struktur ud fra en given formel er nok lidt en udfordring.
1) konverter streng til array/liste af objekt som kan repræsentere både variable, konstanter og operatorer 2) konverter fra infix til postfix notation 3) beregn eller reducer
Der er iøvrigt en anden som har spurgt om næsten det samme her http://www.eksperten.dk/spm/553701 (og en anden bruger har faktisk fundet et link til noget kode som ser interessant ud)
-> arne_v: Ja, jeg har også selv surfet lidt rundt. Var faktisk slet ikke klar over denne tilgang til denne "infix-postfix"-tankegang (selv om jeg har brugt HP-lommeregner altid :-)), men den er selvfølgelig oplagt i den her sammenhæng, idet den kan beskrives entydigt i en algoritme. Søger man på "postfix evaluation" finder man også et par interessante hits, som peger i retning af maskinkode-/assembler-teknikker med push/pop på en stak.
Teknikken omkring "infix til postfix" er altså velkendt og kan beskrives entydigt ved en simpel algoritme, og teknikken omkring "postfix evaluation" (her tænker jeg på den numeriske del) er ligeledes velkendt, idet enhver beregning foretages mellem præcis to tal.
Videre kan man så spørge, om den mere abstrakte algebraiske (og altså ikke numeriske) reduktionsalgoritme tilsvarende kan beskrives som en simpel algoritme, hvor reduktionsreglerne måske er (rangordnede) kandidater til, hvad der skal ske med variablerne og operatorerne i stakken.
Har du/I nogen mening om dette, hvis I forstår mit spm.? - ellers uddyber jeg gerne. Der må næsten også findes en (algoritmisk) beskrivelse af denne udvidede del (?)
-> arne_v: Ok, jeg forsår, hvad du mener her. Kan du evt. sige noget om metoden i denne reduktion via en stak? Jeg er lidt interesseret i, hvordan gængse algebraiske reduktionsregneregler kan implementeres i relation til evaluering af postfix - det må vel være en del mere komplekst end simpel numerisk beregning?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.