我必须为各种参数空间求解一个非线性方程组。我正在使用FindRoot,它对初始起始点敏感,因此我必须手工完成并通过反复试验和绘图,而不是将方程放在循环或表格中。
所以我想要做的是创建一个数据库或一个具有固定列数但行数可变的矩阵,这样我可以在解决它们的时候继续添加新结果。
现在我使用了类似的东西:
{{{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)。
这似乎对我有用,但结果不再是Matrix,但数据存储为一些文本类型的东西。
无论如何我可以保留一个矩阵或数据库,每当我手动解决FindRoot时,我会不断添加行吗?同样,我需要手动进行FindRoot,因为它对起点敏感,如果没有先绘制它,我不知道好的起点。
非常感谢
答案 0 :(得分: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值的灵敏度问题,你可以在循环中探索参数空间,缓慢地改变参数并使用前一个循环迭代中的x和y解决方案每次你的新a和b值。
答案 1 :(得分:0)
使用Read
代替Get
可以实现您想要做的事情。虽然Get
在一次运行中读取完整文件,但可以调整Read
以提取单个Expression
,Byte
,Number
等等。所以你应该做的就是打开文件并在表达后读取表达式并将其打包到列表中。
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];