我正在尝试使用 MATLAB 的bvp4c函数来解决 ODE 的耦合系统。我想强加
其中是第一个状态变量。
另一篇文章建议在 ODE 系统中添加一个额外的方程。即
然后附加的边界条件将强制执行我想要的积分条件。但是,我不确定如何在 MATLAB 中编写代码。谁能帮我这个?
按照尼科瓜罗的评论,积分方程可以写为
相应地更新代码,我有
这是我正在使用的整个代码bvp4c(如基里尔说,包含整个代码会很有用):
s = 100;
solinit = bvpinit(linspace(0,pi,1001),@mat4init,s);
sol = bvp4c(@odeproblem,@eightbc,solinit);
x = linspace(0,pi,1001);
y = deval(sol,x);
trapz(y(1,:).*y(1,:))
y_bar = y(1,:)./norm(y(1,:),2);
plot(x,y(1,:))
fprintf('The intial guess for s was %d. The value solved for was %d.\n',s,sol.parameters)
function dydt = odeproblem(t,y,s)
b = pi;
dydt(1) = y(2);
dydt(2) = y(3);
dydt(3) = y(4);
dydt(4) = y(5);
dydt(5) = y(6);
dydt(6) = y(7);
dydt(7) = y(8);
dydt(8) = (-b^4*y(1) + 2*b^2*y(3) - (b^4-2)*y(5) - 2*s^2*b^2*y(7))/s^2;
dydt(9) = y(1)*y(1);
end
function res = eightbc(ya,yb,s)
res = [ya(1); yb(1); ya(3); yb(3); ya(5); yb(5); ya(7); yb(7); ya(9); yb(9)-1];
end
function yinit = mat4init(x)
yinit = [ cos(2*x), -2*sin(2*x), -4*cos(2*x), 8*sin(2*x),...
16*cos(2*x), -32*sin(2*x), -64*cos(2*x), 128*sin(2*x), 1];
end
这是解决方案的图:
所有其他边界条件似乎都得到满足(我没有包括显示的图)。但积分条件仍然不是。
