Mathematica-Ausgabeformat für große Zahlen

  • Ich muss die Ausgabe eines Mathematica-Ausdrucks (einer Liste von Gleichungen) in eine Datei schreiben. Ich verwende

         WriteInput[fname_, var_, eqlist_] := Module[{str, leq},
        str = OpenWrite[fname];
        leq = Length[eqlist];
        WriteString[str, "{"];
        removebracketvar[x_] := 
        StringReplace[StringReplace[ToString[x],{"["-> "","]"->"",","->""}],Whitespace->""];
        (*write equations*)
        Do[ 
        WriteString[str, 
        removebracketvar[ToString[eqlist[[i]] , InputForm]] ];
        WriteString[str , ";\n"] ,
        {i, leq}];
        WriteString[str, "}"];
        Close[str]
        ]
     

    Dies funktioniert gut für kleine Koeffizienten, z. B.

      SetDirectory["/home/mydir"];WriteInput["sys1.txt",{x[1,1],x[2,1],x[1,2]},  
     {3.4x[1,1]^2,x[2,1]^2,x[1,2]^2}]
     

    dh es erzeugt die folgende Datei sys1.txt

     {3.4*x11^2;
    x21^2;
    x12^2;
    }
     

    Das Problem tritt jedoch auf, wenn 1. Die Koeffizienten sind ganzzahlig, z. B.

     SetDirectory["/home/mydir"];
    WriteInput["sys1.txt", {x[1, 1], x[2, 1], x[1, 2]}, {3.0 x[1, 1]^2, x[2, 1]^2, x[1, 2]^2}]
     

    . Dies schreibt sys1.txt als

     {3.*x11^2;
    x21^2;
    x12^2;
    }
     

    wobei '3.' ist für spätere Operationen an der Datei durch einen anderen externen Code nicht geeignet. Ich möchte 3,0 oder 3.

    Koeffizienten in wissenschaftlicher Form sind ebenfalls problematisch. ZB

       SetDirectory["/home/mydir"];
      WriteInput["sys1.txt", {x[1, 1], x[2, 1], x[1, 2]},
        {3.998723445*10^6 x[1, 1]^2, x[2, 1]^2, x[1, 2]^2}]
     

    gibt

     {3.998723445*^6*x11^2;*x11^2;
    x21^2;
    x12^2;
    }
     

    wo es diese seltsame *^ Notation für die Exponenten. Ich möchte stattdessen 10 ^ (6) oder nur in der nichtwissenschaftlichen Form, d. H. 3998723.445 ist auch in Ordnung.

    Gibt es eine gute Möglichkeit, diesen Kurzcode so anzupassen, dass die Koeffizienten in der gewünschten Form abgerufen werden?

    21 April 2012
    Verbeia
1 answer
  • Sie können eigene Definitionen für die Formatierung von Zahlen und Variablen definieren.

     WriteInput1[file_, var_, eqlist_] := 
     Module[{text, removewhite, eq2, gg, hh, format},
    
      format[a_?NumericQ] := Block[{Format},
        ToString@NumberForm[a, 10,
          NumberFormat -> (Module[{man},
              man = #1;
              If[StringTake[#1, -1] === ".", man = man <> "0"];
              If[#3 === "", man, Row[{man, "*10^(", #3, ")"}]]] &)]];
    
      gg /: Format[gg[a_], InputForm] := OutputForm[format[a]];
      hh /: Format[hh[a_], InputForm] := OutputForm[
        StringReplace[ToString[a], {"[" -> "", "]" -> "", "," -> ""}]];
    
      eq2 = eqlist /. Join[(# -> hh[#]) & /@ var, {a_?NumericQ :> gg[a]}];
    
      removewhite[x_String] := StringReplace[x, Whitespace -> ""];
      (*write equations*)
    
      text = Fold[# <> removewhite[ToString[#2, InputForm]] <> ";\n" &,
        "{", eq2];
      text = text <> "}";
      WriteString[OpenWrite[file],text];
      Close[file];
      text
      ]
     

    ToString verwendet Format, um zu entscheiden, wie Ausdrücke in Strings konvertiert werden. Was ich hier mache, ist das Umhüllen aller Vorkommen von Elementen in var mit hh und alle Zahlen mit gg und die Verwendung von TagSet, um Format mit Ausdrücken der Form gg[...] oder && 9&&].

    Beispiel

     WriteInput1["sys1.txt", {x[1, 1], x[2, 1], x[1, 2]},
        {3.998723445*10^6 x[1, 1]^2, x[2, 1]^2, x[1, 2]^2}]
    
    (* ==> {3.998723445*10^(6)*x11^2;
           x21^2;
           x12^2;
           }
    *)
    
    WriteInput["sys1.txt", {x[1, 1], x[2, 1], x[1, 2]}, 
        {3.0 x[1, 1]^2, x[2, 1]^2, x[1, 2]^2}]
    
    (* => {3.0*x11^2;
          x21^2;
          x12^2;
          }
    *)
     
    21 April 2012
    EAMannAndrew