Mathematica добавление матрицы - PullRequest
2 голосов
/ 03 февраля 2012

Я должен решить систему нелинейных уравнений для широкого диапазона параметров пространства. Я использую 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) переменных.

Кажется, это работает для меня, но результат уже не Матрица, а данные хранятся как текстовые объекты.

Могу ли я в любом случае сделать так, чтобы матрица или база данных оставались там, где я продолжаю добавлять в нее строки каждый раз, когда решаю вручную для FindRoot? Опять же, мне нужно сделать FindRoot вручную, потому что он чувствителен к начальным точкам, и я не знаю хороших начальных точек без предварительного их построения.

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 04 февраля 2012

То, что вы хотите сделать, может быть достигнуто с помощью 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];
0 голосов
/ 04 февраля 2012

Если я не понимаю, что вы пытаетесь сделать, это должно работать

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 каждый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...