1

遅いです-関数のどこにエラーがあるのか​​わかりませんerror。パラメータ推定を試みています。

function value = lv(t,y,p)
    %Lotka-Volterra Model
    %p(1)=a, p(2) = b, p(3) = c, p(4) = r.
    value = [-p(1)*y(1)-p(2)*y(1)*y(2);-p(4)*y(2)+p(3)*y(1)*y(2)];
end

function error = lverr(p)
    %LVERR: Function defining error function for
    %example with Lotka-Volterra equations.
    H = [30.0 47.2 70.2 77.4 36.3 20.6 18.1 21.4 22 25.4 27.1];
    L = [4 6.1 9.8 35.2 59.4 41.7 19 13 8.3 9.1 7.4];

    [t,y] = ode45(@lv,[0 10],[H(1);L(1)],[],p);
    value = (y(:,1)-H').^2+(y(:,2)-L').^2;
    %Primes transpose data vectors H and L
    error = sum(value);
end

そして、私がコードを実行するために使用するメインファイル:

clc; 
clear all;
format long;

H = [30.0 47.2 70.2 77.4 36.3 20.6 18.1 21.4 22 25.4 27.1];
L = [4 6.1 9.8 35.2 59.4 41.7 19 13 8.3 9.1 7.4];
guess = [0.47;0.024;0.023;0.76];
[p,error] = fminsearch(@lverr,guess);
[t,y]=ode45(@lv,[0 10],[30.0; 4.0],[],p);
subplot(2,1,1)
plot(t,y(:,1))
subplot(2,1,2)
plot(t,y(:,2))

エラーは次のとおりです。

??? Error using ==> minus
Matrix dimensions must agree.

Error in ==> lverr at 8
    value = (y(:,1)-H').^2+(y(:,2)-L').^2;
4

1 に答える 1

5

積分器は、適応ステップサイズ、可変次数のode45ルンゲクッタ法です。これが意味するのは、各ステップで使用されるステップサイズは、その時点でのソリューションの動作に依存するということです。これが意味することは、出力の要素の数は[t,y]実行ごとに大きく異なり、決して信頼されるべきではないということです。

ではlverr(p)、このような積分の結果といくつかの固定長ベクトルの差を取りたいと考えています。これは、事実上常に失敗します。あなたはできる

  1. 固定ステップインテグレータを使用する(決してお勧めできません)
  2. 指定された時間にのみ出力を生成するように強制します(と同じ数の要素を持つようにode45調整します)tspanH
  3. 物理的に意味のある意味でベクトルH(および)を補間します。L

余談errorですが、変数名としての使用はご遠慮ください。これも組み込み関数であるため、ユーザーとMatlabインタープリターの両方に混乱を招く可能性があります。

于 2012-10-25T07:47:00.160 に答える