2014-04-18 11 views
5

Uso il software maxima per semplificare le formule. Di solito, posso gestirmi facilmente con subst, ratsubst, factor, ratsimp, ... Ma ci sono ancora poche formule che trovo difficili da semplificare nel modo in cui mi piacerebbe.semplificare le formule nel software maxima

  1. assumendo che a> b, c> d, mi piacerebbe semplificare le frazioni che iniziano con un segno - in questo modo:

    -(a - b)/(d - c) -> (a - b)/(c - d) 
    

    ma non come farlo. Sembra che l'algoritmo di maxima semplificatore proverà a ordinare le variabili a modo suo.

    Ho creato la mia funzione massima per cercare di semplificare questi segni meno inutili.

    no_minus(fraction):= 
        block([simp:true, 
        numerat:expand(-ratnumer(fraction)), 
        denominat:expand(-ratdenom(fraction))], 
        block([simp:false], 
         numerat/denominat)); 
    -a/(b-x); 
    no_minus(-a/(b-x)); 
    no_minus(-a*b*c/(b-x*b*f-f)); 
    

    Mi aspettavo no_minus (-a/(b-x)) sarebbero tornati a/(x-b), ma non l'ho fatto.

  2. Vorrei introdurre un nuovo operatore di infisso per indicare che due espressioni sono approssimativamente uguali. Ad esempio, se x è approssimativamente uguale a y. Mi piacerebbe notare che

    x =~ y

    infix("=~").

Come configurare il semplificatore in modo che quando l'ingresso è

2*x+3 =~ u+v;
(%-3)/2;

l'uscita è

x =~ (u+v-3)/2

risposta

5

Beh, è ​​possibile definire regole di semplificazione tramite tellsimp (e tellsimpafter, defrule, e defmatch). Forse questo è sufficiente per iniziare.

(%i3) infix ("=~") $ 
(%i4) matchdeclare ([aa, bb, cc], all) $ 
(%i5) tellsimp ((aa =~ bb) * cc, (aa * cc) =~ (bb * cc)) $ 
tellsimp: warning: rule will treat '?mtimes' as noncommutative and nonassociative. 
(%i6) tellsimp ((aa =~ bb) + cc, (aa + cc) =~ (bb + cc)) $ 
tellsimp: warning: rule will treat '?mplus' as noncommutative and nonassociative. 
(%i7) (2*x + 3) =~ (u + v); 
(%o7) (2*x+3) =~ (v+u) 
(%i8) (% - 3)/2; 
(%o8) x =~ ((v+u-3)/2) 
+0

Grazie, è stato davvero un buon inizio. Ho appena aggiunto rbp = 80 e lbp = 80 per sbarazzarmi della parentesi. Questo è ciò di cui avevo bisogno per risolvere il mio infisso operatore "approssimativo" .; infisso ("= ~"); matchdeclare ([aa, bb, cc], tutti); tellimp ((aa = ~ bb) * cc, (aa * cc) = ~ (bb * cc)); tellimp ((aa = ~ bb) + cc, (aa + cc) = ~ (bb + cc)); (2 * x + 3) = ~ (5 * y^2 + 6); (% -3)/2; 2 * x + 3 = ~ 5 * y^2 + 6; (% -3)/2; infisso ("= ~", 80,80); 2 * x + 3 = ~ 5 * y^2 + 6; (% -3)/2; "= ~" (2 * x, 3 * y + 4); % -4; – Arthur