2012-02-03 88 views
2

我必須爲廣泛的參數空間求解一個非線性方程組。我使用FindRoot,它對初始起點敏感,所以我必須通過手動和反覆試驗和繪圖來完成,而不是將方程放在循環或表格中。Mathematica附加矩陣

所以我想要做的就是創建一個數據庫或矩陣具有固定的列數,但是行數可變,所以我可以跟上新結果追加它,當我爲他們解決。

現在我用類似:

{{{xx, yy}} = {x, y} /. FindRoot[{f1(x,y) == 0,f2(x,y)==0}, {x,a},{y,b}], 
g(xx,yy)} >>> "Attempt1.txt" 

我在哪裏解決兩個變量,然後存儲變量的變量,也是一個函數g(XX,YY)。

這似乎爲我工作,但結果不是矩陣任何以上,但該數據被存儲爲一些文本類型的事情。

有反正我能得到這個留一個矩陣或者我把每一個我用手解決FindRoot時間加入行是數據庫?同樣,我需要手動完成FindRoot,因爲它對起點敏感,我不知道沒有先繪製好的起點。

非常感謝

+1

我不明白爲什麼這不是一個矩陣了。考慮這個'Put [{{1,2},{3,4}},「tmp.mx」];獲取[「tmp.mx」]'這是再次導入後完全相同的表達式。 – halirutan 2012-02-03 07:08:17

+0

它將所有內容都存儲爲一個條目。假設我做了data = Import [「temp.mx」],然後我做了維[數據],它回答1.我不知道如何提取信息。當我做數據[[1]]時,它輸出整個數據。我無法提取個別信息。當我做數據時[[1,1]]給出錯誤。 – user1169757 2012-02-04 00:34:43

+0

所以我在For循環中做了22次{x1,x2,x3,x4,x5,x6,x7,x8,x8,x10} >>>「temp.mx」。現在,當我做數據=導入[「temp.mx」,「表」],然後做Dimensions [數據]我得到110.我真正想要的是一個10列和22行的矩陣。每行/記錄中的每個10個數據都存儲爲5個數據,總維數爲5x22 = 110。例如,data [[1]] = {「{24258.225756005108」,「0.0001254874133927587」,\ 「0.10668678000535163」,}等等。無論如何,我可以將數據存儲在乾淨的10x22矩陣中,其中數據[[i,j]]表示第i個記錄的第j個值。謝謝。 – user1169757 2012-02-04 00:46:01

回答

0

除非我不理解你想要做什麼,這應該工作

results = {}; 
results = Append[Flatten[{{xx, yy} = {x, y} /. FindRoot[{f1(x,y) == 0,f2(x,y)==0}, {x,a},{y,b}],g(xx,yy)}],results]; 
每次你綁到行添加到矩陣結果時間

然後通過手,你只需要輸入

results = Append[Flatten[{{xx, yy} = {x, y} /. FindRoot[{f1(x,y) == 0,f2(x,y)==0}, {x,a},{y,b}],g(xx,yy)}],results]; 

順便說一句,避開初始a和b值敏感性的問題,你可以在一個循環中探索參數空間,不同的日e參數,並且每次使用前一個循環迭代中的x和y解決方案來獲得新的a和b值。

0

你想要做什麼可以用Read代替Get來實現。雖然Get讀取一個運行完整的文件,Read可以調整,以提取單個ExpressionByteNumber等等。所以你應該做的是打開你的文件,並在表達後讀取表達式並將其包裝在列表中。

PutAppend[{{1, 2}, {3, 4}}, "tmp.mx"] 
PutAppend[{{5, 6}, {7, 8}}, "tmp.mx"] 
PutAppend[{{9, 23}, {11, 12}}, "tmp.mx"] 
PutAppend[{{13, 14}, {15, 16}}, "tmp.mx"] 

stream = OpenRead["tmp.mx"]; 
mat = ArrayPad[ 
    NestWhileList[Read[stream, Expression] &, 
    stream = OpenRead["tmp.mx"], # =!= EndOfFile &], -1]; 
Close[stream]; 

現在你在mat有一個包含所有行的列表。的ArrayPad,其中一個元件在每個端部切斷是必要的,因爲第一元素包含OpenRead的輸出和最後一個元素包含EndOfFile。如果你不熟悉像NestWhileList功能結構,那麼你可以把它放在一個循環,只要你喜歡,因爲它實際上只是反覆調用Read

stream = OpenRead["tmp.mx"]; 
mat = {}; 
AppendTo[mat, Read[stream, Expression]]; 
AppendTo[mat, Read[stream, Expression]]; 
AppendTo[mat, Read[stream, Expression]]; 
AppendTo[mat, Read[stream, Expression]]; 
Close[stream];