2012-02-03 80 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];