2015-08-24 2 views
1

У меня есть ODE, который использует множество функций. Я хочу экспортировать эти «вспомогательные» функции, чтобы я мог графически их сопоставлять с независимой переменной ODE.Matlab: Экспорт переменных из ODE45

function dFfuncvecdW = ODE(W,Ffuncvec); 
X = Ffuncvec(1); 
y = Ffuncvec(2); 

#lots of code 
R = ... #R is a function of X,W and y. 
#and a few other functions that are a function of X,W and y. 

dXdW = ... #some formula 
dydW = ... #some formula 
dFfuncvecdW = [dXdW; dydW]; 

end 

Я называю эту функцию:

Wspan = [0 8000.] 
X0 = [0; 1.] 
[W,X] = ode45(@ODE, Wspan, X0); 

Я могу легко выводить X или W в файл Excel:

xlswrite(filename,X,'Conversion','A1'); 

Но я то, что мне нужно, чтобы сохранить "R" и многие другие значения функций в файл Excel.

Как это сделать?
Я до сих пор чрезвычайно новичок в Matlab. Обычно я использую Polymath, но для этой системы ODE Polymath не может вычислить ответ в течение разумного промежутка времени.

EDIT1: Используемый мной код был создан Polymath. Я использовал базовую версию моей проблемы, так что Polymath может превзойти программу, поскольку она дает код Matlab только после успешного запуска кода Polymath. После экспорта была введена полная система уравнений.

ответ

0

Я нашел довольно быстрое и безболезненное решение для моего ответа. Я просто добавил текстовый файл с кодом внутри функции ode.

EDIT: Я не могу комментировать, потому что у меня достаточно репутации в этой ветке SE. Мое решение было добавить следующий код:

fid = fopen('abc1.txt', 'at'); 
fprintf(fid, '%f\n', T); 
fclose(fid); 

прямо над

dYfuncvecdW = [dFAdW; dFBdW; dFCdW; dFDdW; dydW]; 

в конце функции ода. Это оказалось временным решением. Я открыл еще один вопрос о выходе, который я получил.

+0

Рад, что вы нашли решение. Однако этот ответ строго отсутствует в деталях - это не намного больше, чем комментарий. Вы должны обновить его, чтобы более конкретно показать, что вы сделали, включая код. Кроме того, сохранение в выходной файл из вашей функции ODE может привести к недействительным/несогласованным данным. Функция ODE может быть оценена много раз за каждый шаг времени (например, в случае недействительного шага). Использование функции вывода, как указано в моем ответе, позволяет избежать этого. Выходная функция вызывается только один раз за один шаг после успешного шага. – horchler

0

Самый простой, и, возможно, самый быстрый, способ справиться с этим переоценивать свои функции послеode45 возвращается W и X. Если функции векторизовать, это будет легко. В противном случае просто используйте простой цикл for, который выполняет итерацию с 1 до length(W).

В качестве альтернативы, вы можете использовать output function, чтобы сохранить значения на каждой итерации в файл, или global, или, наиболее эффективно, суб-функция переменной (ака nested function), что акции сфера с внешней функцией (см here , например). См. Раздел this answer, посвященный использованию функции вывода.

+0

Я не могу просто переоценить функцию, поскольку она довольно сложна и станет еще более в будущем. Если я использую метод переоценки, у меня будет более 200 уравнений для переоценки большого количества очков. Я использую Matlab для ускорения вычислений, так как Polymath очень медленный (время работы 50 мин). – 22134484

+0

Что касается метода выходных функций: я понятия не имею, как его использовать, и сообщение, которое вы связали со мной, намного выше моего знания matlab. – 22134484

+0

Что-то я нашел: я могу использовать disp (var) в функции ODE для вывода значений переменных в рабочую область. Как я могу сохранить их в файл непрерывно?(добавление файла) – 22134484

Смежные вопросы