Avatar billede jespersahner Nybegynder
23. oktober 2004 - 12:49 Der 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?
Avatar billede vis_dk Nybegynder
23. oktober 2004 - 13:18 #1
Lytter med.
Avatar billede arne_v Ekspert
23. oktober 2004 - 14:18 #2
Java "out-of-the-box" : nej.

Enten skal du finde en bibliotek eller du skal selv kode noget.
Avatar billede jespersahner Nybegynder
23. oktober 2004 - 16:18 #3
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.
Avatar billede jespersahner Nybegynder
23. oktober 2004 - 16:19 #4
"Træet" blev ikke helt som i min Notepad, men meningen er forhåbentlig klar nok :-)
Avatar billede arne_v Ekspert
23. oktober 2004 - 18:22 #5
Teknikken er rimelig velkendt.

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
Avatar billede arne_v Ekspert
23. oktober 2004 - 18:23 #6
exp((a+cos(b*c))/d)

bliver til

a b c * cos + d / exp
Avatar billede jespersahner Nybegynder
23. oktober 2004 - 19:32 #7
-> arne_v: Er det som "omvendt polsk notation" du mener her?
Avatar billede arne_v Ekspert
23. oktober 2004 - 19:37 #8
Ja

postfix = omvendt polsk notation
Avatar billede arne_v Ekspert
23. oktober 2004 - 19:38 #9
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)
Avatar billede jespersahner Nybegynder
23. oktober 2004 - 20:07 #10
-> 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 (?)

Foreløbig meget interessant!!
Avatar billede arne_v Ekspert
23. oktober 2004 - 20:11 #11
både konvertering infix->postfix og evaluering af postfix udtryk laves
nemmest med en stak

Man kan også relativt nemt reducere på et postfix udtryk via en stak

... konstant konstant operator kan reduceres til ... konstant etc.
Avatar billede arne_v Ekspert
23. oktober 2004 - 20:11 #12
Jeg har faktisk engang skrevet en masse C++ kode som laver nogle af de her ting.

Jeg har dog ikke vild meget lyst til at konvertere det til Java.
Avatar billede jespersahner Nybegynder
23. oktober 2004 - 20:34 #13
-> arne_v: Det forstås :-) Har du nogen mening om den algebraiske reduktionsdel? (altså ikke den numeriske, som jeg går ud fra du refererer til)
Avatar billede arne_v Ekspert
23. oktober 2004 - 20:39 #14
Ovenstående er da også algebraisk.

Det var tilfældigvis med konstaner men.

variabelX + variabelX - kan reduceres til ingenting
Avatar billede jespersahner Nybegynder
23. oktober 2004 - 20:47 #15
-> 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?
Avatar billede arne_v Ekspert
23. oktober 2004 - 20:50 #16
Jeg ved ikke hvad der er smartest.

Jeg smider bare på en stak og tester et antal reduktions regler mod toppen af stakken.

A la:

while(more) {
  stack.push(item);
  while(reduce(stack));
}

hvor reduce så tester for en 15-20 regler.
Avatar billede jespersahner Nybegynder
23. oktober 2004 - 21:12 #17
-> arne_v: Nu må der point på bordet, send lige et svar - så må jeg vende tilbage med evt. yderligere spm. i et nyt spm. :-)

I relation til reduktion kan man måske finde noget under "Wolfram", som har udviklet "Mathematica". Det er temmelig fancy, så vidt jeg ved.
Avatar billede arne_v Ekspert
23. oktober 2004 - 21:14 #18
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester