Matlab: нахождение коэффициентов системы ОДУ

У меня есть все данные и система ОДУ из трех уравнений с 9 неизвестными коэффициентами (a1, a2,..., a9).

dS/dt = a1*S+a2*D+a3*F
dD/dt = a4*S+a5*D+a6*F
dF/dt = a7*S+a8*D+a9*F

t = [1 2 3 4 5]
S = [17710 18445 20298 22369 24221]
D = [1357.33 1431.92 1448.94 1388.33 1468.95]
F = [104188 104792 112097 123492 140051]

Как найти эти коэффициенты (a1,..., a9) ОДУ с помощью Matlab?


person Karolis Valiulis    schedule 15.05.2013    source источник
comment
вы проблалби имеете в виду dS/dt,...?   -  person Ander Biguri    schedule 15.05.2013
comment
Это простая линейная система, поэтому ее можно решить аналитически. Затем вы можете подогнать решение к данным, хотя вам, вероятно, потребуется больше наблюдений, чтобы ограничить ваши параметры!   -  person David Zwicker    schedule 15.05.2013
comment
Андер, точно. Я починил это. Как решить в Matlab, есть примеры?   -  person Karolis Valiulis    schedule 15.05.2013
comment
Лучше подходит scicomp.stackexchange.com   -  person Dr_Sam    schedule 15.05.2013
comment
@DavidZwicker: вы говорите, что 15 уравнений недостаточно для решения 9 неизвестных? :)   -  person Rody Oldenhuis    schedule 16.05.2013
comment
Что ж, система переопределена, если исходить из того, что данные точны. Я неявно предположил, что предоставленные данные основаны на измерениях, и для получения коэффициентов требуется подгонка. В этом случае 15 баллов обычно недостаточно для определения коэффициентов.   -  person David Zwicker    schedule 16.05.2013
comment
@DavidZwicker: переопределенные системы обычно допускают решение методом наименьших квадратов ... я думаю, это то, что здесь имелось в виду.   -  person Rody Oldenhuis    schedule 16.05.2013


Ответы (2)


Я не могу тратить на это слишком много времени, но в основном вам нужно использовать математику, чтобы сократить уравнение до чего-то более значимого:

ваше уравнение имеет порядок

dx/dt = A*x

следовательно, решение

x(t-t0) = exp(A*(t-t0)) * x(t0)

Таким образом

exp(A*(t-t0)) = x(t-t0) * псевдо(x(t0))

Псевдо-это псевдообратная Мура-Пенроуза.

РЕДАКТИРОВАТЬ: я еще раз взглянул на свое решение, и я неправильно рассчитал псевдоинверсию.

По сути, Псевдо(x(t0)) = x(t0)'*inv(x(t0)*x(t0)'), как x(t0) * Pseudo(x(t0)) равно единичной матрице

Теперь вам нужно предположить, что каждый временной шаг (от 1 до 2, от 2 до 3, от 3 до 4) является экспериментом (поэтому t-t0=1), поэтому решение будет таким:

1- Создайте свою псевдоинверсию:

xt = [S;D;F];
xt0 = xt(:,1:4);

xInv = xt0'*inv(xt0*xt0');

2- Получить экспоненциальный результат

xt1 = xt(:,2:5);
expA =  xt1 * xInv;

3- Получить логарифм матрицы:

A = logm(expA);

А так как t-t0= 1, то A — наше решение.

И простое доказательство для проверки

[t, y] = ode45(@(t,x) A*x,[1 5], xt(1:3,1));
plot (t,y,1:5, xt,'x')

введите здесь описание изображения

person Rasman    schedule 15.05.2013
comment
Не правильно рассчитал псевдоинверсию... Исправлено - person Rasman; 15.05.2013
comment
@RodyOldenhuis По сути, вы применяете одинаковый вес ко всем трем переменным, несмотря на то, что одна из них на несколько порядков больше, чем другие. Если вы посмотрите на относительные значения (sum((1-y(:)./xt(:)).^2), то мое решение будет 4,4922e-04 против 0,0143. Другими словами, пока вы наказываете F за отклонение, вы Вы гораздо более снисходительны к Д. - person Rasman; 16.05.2013
comment
Я все еще немного не понимаю деталей вашего метода... Как бы вы решили проблему, когда приращение в t было неравномерным? - person Rody Oldenhuis; 16.05.2013
comment
Кроме того, когда я беру ваше решение в качестве начальной оценки и запускаю его через оптимизатор, я могу довольно легко уменьшить сумму относительных квадратов ошибок до 3.86846e-004 (то же самое для абсолютных ошибок). Это означает, что ваше решение не является оптимальным с точки зрения метода наименьших квадратов... Возможно, мы можем принять участие в обсуждении здесь. - person Rody Oldenhuis; 16.05.2013
comment
@RodyOldenhuis Это решение LS для экспоненциала A. Это то, что предоставляет Мур-Пенроуз (см. Википедию). Хотя я не использую все точки данных, которые я мог бы использовать для дальнейшего уточнения решения, ошибка аппроксимации оценивается как небольшая и относительно тривиальная по техническим стандартам и будет считаться достаточной. Оценка параметров — очень уродливая тема, и нужно использовать любое решение, которое выполняет эту работу. - person Rasman; 16.05.2013
comment
@RodyOldenhuis Что касается неравномерного значения t: большинство инженерных приложений отбирают t через равные промежутки времени. Будет ли мое решение работать для переменной t? Не в нынешнем виде, но есть алгоритмы, которые могут с этим справиться. У ОП была простая проблема, поэтому я дал ему простое решение. - person Rasman; 16.05.2013
comment
Большое тебе спасибо. У меня есть несколько вопросов: 1) предположить каждый временной шаг (от 1 до 2, от 2 до 3, от 3 до 4) - где вы предполагаете, что каждый временной шаг в вашем коде? 2) xt0 = xt(:,1:4); - зачем брать из данных всего 4 точки данных и оставлять пятые? - person Karolis Valiulis; 19.05.2013
comment
Столбцы @shummis xt0 имеют временной шаг 1, 2, 3 и 4, а xt1 имеет временной шаг 2, 3, 4 и 5. - person Rasman; 19.05.2013
comment
Хорошо, но почему бы вам не сделать xt0 = xt(:,1:5) ? - person Karolis Valiulis; 19.05.2013
comment
@shummis Проблема заключается в попытке спроецировать точки данных из одного состояния в другое. t=1 проецируется на t=2, t=2 проецируется на t=3... t=5, следовательно, проецируется на t=6, чего вы не предоставляете (и я не могу создавать данные). Я могу использовать только t=5 в качестве конечной точки. Точно так же я могу использовать только t = 1 в качестве отправной точки, поскольку у меня нет t = 0. - person Rasman; 20.05.2013
comment
@Rasman, как быть с этими временными шагами, если у меня больше данных? t = [0 1 2 3 4 5 6 7 8 9 10 11] S = [17110 18045 19898 22069 23621 24414 24294 24433 24302 23107 22074 21162] D = [1157.33 1231.92 1248.94 1188.33 1268.95 1215.5 1298.84 1302.99 1235.16 1210.36 1535.1 1541.52] F = [104181 104790 112092 123490 140048 149941 172326 194574 227427 219278 215672 242864] Как это решить? Большое спасибо ;) - person Karolis Valiulis; 20.05.2013
comment
Извини, @Rasman, если мои вопросы покажутся тебе глупыми, но мне очень нужна твоя помощь. Не могли бы вы помочь мне с предыдущим вопросом? - person Karolis Valiulis; 21.05.2013
comment
@shummis Используйте мой код выше, и когда вы увидите 4 или 5, замените его по мере необходимости. - person Rasman; 21.05.2013
comment
@Rasman Я сделал это и получил притчи, которые хорошо показывают тенденции, но не очень точно соответствуют данным. - person Karolis Valiulis; 21.05.2013
comment
@shummis Вы оцениваете параметры нестабильной системы. Очень трудно заставить эти вещи вести себя особенно в таких обстоятельствах. Спросите себя, верна ли модель, и если вам не нравится ответ, откройте учебник и найдите лучшее решение или попробуйте обмен стеками с перекрестной проверкой. Кроме того, в этих обстоятельствах ожидается шум/ошибка данных... это все равно, что представить себе форму льда из лужи. - person Rasman; 21.05.2013

У вас есть линейная связанная система обыкновенных дифференциальных уравнений,

y' = Ay    with    y = [S(t);  D(t);  F(t)]

и вы пытаетесь решить обратную задачу,

A = unknown

Интересно!

Первая линия атаки

Для заданного A такие системы можно решать аналитически (например, прочтите вики).

Общее решение для расчетных матриц 3x3 A принимает вид

[S(t) D(t) T(t)].' = c1*V1*exp(r1*t) + c2*V2*exp(r2*t) + c3*V3*exp(r3*t)

с V и r собственными векторами и собственными значениями A соответственно и скалярами c, которые обычно определяются начальными значениями задачи.

Таким образом, казалось бы, есть два шага для решения этой проблемы:

  1. Найдите векторы c*V и скаляры r, которые лучше всего соответствуют вашим данным.
  2. восстановить A из собственных значений и собственных векторов.

Тем не менее, идти по этой дороге неприятно. Вам нужно будет решить нелинейную задачу наименьших квадратов для уравнения суммы экспонент, которое у вас есть (например, используя lsqcurvefit). Это даст вам векторы c*V и скаляры r. Затем вам придется каким-то образом распутать константы c и реконструировать матрицу A с помощью V и r.

Итак, вам нужно найти c (3 значения), V (9 значений) и r (3 значения), чтобы построить матрицу 3x3 A (9 значений) — мне это кажется слишком сложным.

Более простой метод

Есть более простой способ; использовать грубую силу:

function test

    % find  
    [A, fval] = fminsearch(@objFcn, 10*randn(3))

end

function objVal = objFcn(A)

    % time span to be integrated over
    tspan = [1 2 3 4 5];

    % your desired data
    S = [17710    18445    20298    22369    24221   ];
    D = [1357.33  1431.92  1448.94  1388.33  1468.95 ];
    F = [104188   104792   112097   123492   140051  ];

    y_desired = [S; D; F].';

    % solve the ODE
    y0 =  y_desired(1,:);
    [~,y_real] = ode45(@(~,y) A*y, tspan, y0);

    % objective function value: sum of squared quotients
    objVal = sum((1 - y_real(:)./y_desired(:)).^2);

end

Все идет нормально.

Тем не менее, я попробовал как сложный способ, так и подход грубой силы, описанный выше, но мне было очень трудно получить квадрат ошибки где-либо близко к удовлетворительно малой.

Лучшее решение, которое я смог найти после многочисленных попыток:

A =
    1.216731997197118e+000    2.298119167536851e-001   -2.050312097914556e-001
   -1.357306715497143e-001   -1.395572220988427e-001    2.607184719979916e-002
    5.837808840775175e+000   -2.885686207763313e+001   -6.048741083713445e-001

fval =
    3.868360951628554e-004

Что совсем неплохо :) Но мне бы хотелось, чтобы решение было проще найти...

person Rody Oldenhuis    schedule 15.05.2013
comment
Проще говоря, это простой пример эффекта бабочки, тогда как, если я просто подставлю вашу матрицу A в решение, я получу очень неверный результат при t = 5. Нужно больше сиг фиг. - person Rasman; 16.05.2013
comment
Большое спасибо @RodyOldenhuis Когда я запускаю эту функцию в первый раз, она вычисляет результаты за секунды, но когда я пытаюсь запустить второй раз, она работает вечно и не останавливается. Я использую Matlab 7.11.0 Это происходит для вас? Как выбрать лучшее решение после многочисленных попыток? С наименьшей разницей между заданными точками? - person Karolis Valiulis; 20.05.2013