bvp4 c Matlab: ошибка слишком многих входных аргументов - PullRequest
0 голосов
/ 01 апреля 2020

Мне нужно решить два дифференциальных уравнения первого порядка, с одним неизвестным параметром в каждом уравнении (m_0 и m1 - неизвестные параметры), и у меня есть четыре граничных условия. Моя функция для угадывания решения: pinit:

function pinit = mat4init(z)
pinit = [ 0.65.*cos(z)
          0.65.*cos(z) ];
end

У меня также есть функция для граничных условий mat4bc, где я ставлю граничные условия для первого уравнения (с индексом 1) и после этого для второго уравнение:

   function res = mat4bc(pa, pb)
      res = [ pa(1,:)-8
            pb(1,:)-1
            pa(2,:)
            pb(2,:) ];
   end

Я делаю предположение для неизвестных параметров m0 и m1 со значениями 2 и 1. Вместе с другими значениями в функции matrix4ode приведены дифференциальные уравнения:

function dpdz = matrix4ode(z, p)

m0 = 2;
m1 = 1;
z = linspace(0,pi,10);
ri = 0.7;
R = ri - z .* (ri - 1);
beta = 1;

dpdz = zeros(2, size(z,2));
dpdz(1,:) =   - 32 .* beta .* m0 ./ (R .^ 4 .* p(1,:));
dpdz(2,:) = -( - 8 .* dpdz(1,:) ./ R - dpdz(1,:) .* p(2,:) - 32 .* beta .* m1 ./ R .^ 4 ) ./ p(1,:);
end

И я использую bvpinit:

solinit = bvpinit(linspace(0,pi,10),@mat4init , [2 1]);

и после этого вызываю bvp4 c с кодом:

m0 = 2;
m1 = 1;
z = linspace(0,pi,10);
ri = 0.7;
R = ri - z .* (ri - 1);
beta = 1;
sol = bvp4c(@matrix4ode,@mat4bc,solinit);

и я получил ошибку:

Error using matrix4ode
Too many input arguments.

Error in bvparguments (line 105)
    testODE = ode(x1,y1,odeExtras{:});

Error in bvp4c (line 130)
    bvparguments(solver_name,ode,bc,solinit,options,varargin);

Как, если у меня нет дополнительных входных аргументов в функции matrix4ode? Что мне делать? Вот мой код

1 Ответ

0 голосов
/ 02 апреля 2020

Matlab, в отличие от python scipy's solve_bvp, не имеет переменных параметров. Вы должны добавить их искусственно как переменные состояния, которые имеют производный ноль. Это даст вам (удалив некоторые грубые конструкции)

function dpdz = matrix4ode(z, p)

  m0 = p(3);
  m1 = p(4);
  ri = 0.7;
  R = ri - z .* (ri - 1);
  beta = 1;

  dpdz = zeros(4,1);
  dpdz(1) = - 32 .* beta .* m0 ./ (R .^ 4 .* p(1));
  dpdz(2) = -( - 8 .* dpdz(1) ./ R - dpdz(1) .* p(2) - 32 .* beta .* m1 ./ R .^ 4 ) ./ p(1);
end
...