2015-04-21 54 views
1

我使用Maxima(aka Macsyma)來生成一些係數,Maxima必須在python程序的外部文件中寫入表達式的fortran表示形式來讀出。如何格式化Fortran在Maxima中的輸出

我現在用的是下面這段代碼寫的係數下降:

with_stdout ("An.txt", 
    for n : 0 thru N do 
     fortran(A[n])); 

但不幸的是,他們得到寫下來的文件An.txt恰好是這樣的:

 exp(beta*t)*(-alpha*(beta**2*t**2+2*beta*t+2)*exp(-beta*t)*D/beta* 
    1 *3+alpha*(beta*t+1)*exp(-beta*t)*D/beta**2-alpha**2*(beta**4*t* 
    2 *4+4*beta**3*t**3+12*beta**2*t**2+24*beta*t+24)*exp(-beta*t)/be 
    3 ta**5+2*alpha**2*(beta**3*t**3+3*beta**2*t**2+6*beta*t+6)*exp(- 
    4 beta*t)/beta**4-alpha**2*(beta**2*t**2+2*beta*t+2)*exp(-beta*t) 
    5 /beta**3+%c) 
     alpha*(t-1)*t 
     beta 
     (2*(beta*D+3*alpha*beta*(t-1)*t)+alpha*t+alpha*(t-1))/A_0(t)/6.0E+ 
    1 0 

是的,這是與在每個輸入之前有一個五(或六)個空格縮進,數字表示延續表達。

任何機會我可以得到一個更容易閱讀的版本?一條線上的每個條目都是理想的。我已經嘗試過功能f90,但它沒有打印出任何東西,我也嘗試使用fortindentfortspaces,但沒有任何更改(儘管我可能會使用錯誤的語法)。

在此先感謝。

回答

2

我想你可以在告訴它允許很長的行後使用f90。請注意,f90默認不加載。

(%i1) load (f90) $ 
(%i2) :lisp (setq *f90-output-line-length-max* 1000000000) 
1000000000 
(%i2) A : makelist (expand ((foo + exp(bar*t))^n), n, [5, 10, 20]) $ 
(%i3) with_stdout ("A.txt", for e in A do f90(e)); 
(%o3)        done 

請注意,您必須通過Lisp設置行長度;那是一個疣。這裏是我得到的輸出:

$ cat A.txt 
exp(5*bar*t)+5*foo*exp(4*bar*t)+10*foo**2*exp(3*bar*t)+10*foo**3*exp(2*bar*t)+5*foo**4*exp(bar*t)+foo**5 
exp(10*bar*t)+10*foo*exp(9*bar*t)+45*foo**2*exp(8*bar*t)+120*foo**3*exp(7*bar*t)+210*foo**4*exp(6*bar*t)+252*foo**5*exp(5*bar*t)+210*foo**6*exp(4*bar*t)+120*foo**7*exp(3*bar*t)+45*foo**8*exp(2*bar*t)+10*foo**9*exp(bar*t)+foo**10 
exp(20*bar*t)+20*foo*exp(19*bar*t)+190*foo**2*exp(18*bar*t)+1140*foo**3*exp(17*bar*t)+4845*foo**4*exp(16*bar*t)+15504*foo**5*exp(15*bar*t)+38760*foo**6*exp(14*bar*t)+77520*foo**7*exp(13*bar*t)+125970*foo**8*exp(12*bar*t)+167960*foo**9*exp(11*bar*t)+184756*foo**10*exp(10*bar*t)+167960*foo**11*exp(9*bar*t)+125970*foo**12*exp(8*bar*t)+77520*foo**13*exp(7*bar*t)+38760*foo**14*exp(6*bar*t)+15504*foo**15*exp(5*bar*t)+4845*foo**16*exp(4*bar*t)+1140*foo**17*exp(3*bar*t)+190*foo**18*exp(2*bar*t)+20*foo**19*exp(bar*t)+foo**20 
$ wc A.txt 
    3 3 856 A.txt 

我看到你在輸出中有一個%c;也許你需要替換一些東西來使輸出可以被Python接受?

順便說一句,與後續字符固定寬度從穿孔卡片時代遺留下來的神器....

+0

我有這樣的代碼在Python(甚至與'%C')工作,但已經它不是很乾淨,我認爲出現問題的可能性很大(由於很多「if」)很大。這樣更好。關於打卡的事情,我認爲這是最大的唯一不好的事情:它還沒有真正發展成現代編程語言! – TomCho

+1

@TomCho關於打卡,實際上Maxima只是試圖容納Fortran編譯器的「最低公分母」。固定格式的72個字符行業是Fortranism。我實際上是在二十世紀八十年代初期在打卡上編寫程序......美好時光。 –

+0

是的,但爲什麼不能更容易地切換到更新的格式?或者,實際上,我們想要的任何格式?無論如何,我很高興這個解決方案很簡單,但最終我知道我最終不得不因爲這些事情而遷移到鼠尾草。 – TomCho