Как решить два уравнения с bvp4 c Matlab? - PullRequest
0 голосов
/ 23 марта 2020

Мне нужно решить два дифференциальных уравнения, где у меня есть два граничных условия для каждого уравнения. Из-за этого я выбираю метод Matlab bvp4 c для решения этой системы:

p1' = -32 * beta * m1 / (R ^ 4 * p1) p2' = - ( - 8 * p1' / R - p1' * p2 - 32 * beta * m2 / R ^ 4 ) / p1

У меня есть файл функций bvpfcn.m, где я определил два дифференциальных уравнения :

function dpdz = bvpfcn(z,p)

beta = 1;
m1 = 1;
m2 = 0.1;
ri = 0.7;
z = linspace(0,1,1001);
R = ri - z .* (ri - 1);

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

Затем в функциональном файле bcfcn.m я определил граничные условия. Мои граничные условия:

p(1)|(z=0) = 8

p(1)|(z=1) = 1

p(2)|(z=0) = 0

p(2)|(z=1) = 0

И файл bcfcn.m is:

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

Мое решение должно иметь форму: Форма ожидаемого решения

Из-за этой формы я угадываю функцию типа косинуса:

function g = guess(z)
g = [0.65.*cos(z)
     0.65.*cos(z)];
end

Когда я выполняю все с:

beta = 1;
m1 = 1;
m2 = 0.1;
ri = 0.7;
xmesh = linspace(0,1,1001);
solinit = bvpinit(xmesh, @guess);
sol = bvp4c(@bvpfcn, @bcfcn, solinit);

Я получаю ошибку:

Error using bvparguments (line 111)
Error in calling BVP4C(ODEFUN,BCFUN,SOLINIT):
  The boundary condition function BCFUN should return a column vector of length 2.
Error in bvp4c (line 130)
    bvparguments(solver_name,ode,bc,solinit,options,varargin);

Как сделать вектор столбца, когда у меня есть 4 граничных условия? Мои предположения в порядке?

...