0

私は境界で「強制」入力を使用して、状態システムを取得しました。私の SS 方程式は: zp = A*z * B. (A は正方行列、B 列)

Bがステップ(経験の時間に沿ったもの)であれば問題ありません、私は使えるので

  tevent = 2;
  tmax= 5*tevent;

  n =100;
  dT = n/tmax;
  t = linspace(0,tmax,n);
  u0 = 1 * ones(size(z'));
  B = zeros(nz,n);
  B(1,1)= utop(1)';
  A = eye(nz,nz);

  [tt,u]=ode23('SS',t,u0);

そしてSSは:

  function zp = SS(t,z)
          global A B
          zp = A*z + B;
  end

私の問題は、スロップを適用したときです。そのため、B は時間に依存します。

  utop_init= 20;
  utop_final = 50;
  utop(1)=utop_init;
  utop(tevent * dT)=utop_final;

  for k = 2: tevent*dT -1
      utop(k) = utop(k-1) +(( utop(tevent * dT) - utop(1))/(tevent * dT));
  end

  for k = (tevent * dT) +1 :(tmax*dT)
      utop(k) = utop(k-1);
  end

  global A B
  B = zeros(nz,1);
  B(1,1:n) = utop(:)';
  A = eye(nz,nz);

問題を解決しようとする新しい方程式を書きましたが、「時間ステップ」を調整できず、22x100 (目的) で au を取得できません。

  for k = 2 : n
  u=solveSS(t,k,u0);
  end

SolveSS には次のコードがあります。

function [ u ] = solveSS( t,k,u0)

  tspan = [t(k-1) t(k)];

  [t,u] = ode15s(@SS,tspan,u0);

      function zp = SS(t,z)
          global A B
          zp = A*z + B(:,k-1);
      end

  end

あなたが助けてくれることを願っています!

4

1 に答える 1

2

B連続的に変化する関数を定義し、tそれを関数ハンドルとして渡す必要があります。このようにして、ODE ソルバーが時間ステップを効率的に調整できるようになります (ode15s硬い ODE ソルバーである を使用すると、可変時間ステップがさらに重要であることが示唆されます)。

コードの形式は次のようになります。

function [ u ] = solveSS( t,k,u0)

    tspan = [t(k-1) t(k)];

    [t,u] = ode15s(@SS,tspan,u0,@B);

        function y = B(x)
            %% insert B calculation
        end

        function zp = SS(t,z,B)
            global A
            zp = A*z + B(t);
        end

    end
于 2012-01-27T17:33:06.570 に答える