蠢茨阈枰钊肜斫鈓atlab编程,你写的函数rigid(x,y)中的命令int是进行符号积分的,而传递给rigid函数的量x,
y是double型,这里不能用int。
简单说下解决思路,就是需要将高阶常微分方程转换为一阶常微分方程,才能用MATLAB的ode命令来进行数值计算。可令z1=y, z2=dy/dx, z3=c. 这里y,c都是x的函数y(x),c(x).
可以得到
dz1/dx=z2;
dz2/dx=1/(Fr*B^2)*(1+z2^2)^(1/2)*x^2*z3
对于dz3/dx 可以在关于c的式子中,将积分移到等号左边,c移到等号右边,然后两边对x求导,就可以得到dc/dx,也即有dz3/dx=dc/dx,具体你再自己计算,对比下我在程序中给出的结果.
这样就得到一个关于z1,z2,z3的微分方程组
dz1/dx=...
dz2/dx=...
dz3/dx=...
初始条件为:x=B时, z1(x=B)=0, z2(x=B)=0, z3(x=B)=1.
注意这里z3(x=B)=c(x=B)=1只是我随便假设的初始条件。你需要给出实际的初值c(x=B)是多少?
因为关于c的式子中有从0到x的积分,要计算x=B时,c的初始值,是不是应该要知道0<x<B时,y的表达式?当然如果0<x<B时,有y=常数, 即当0<x<B时,dy/dx=0,这个条件,则确实可以得到z3(x=B)=c(x=B)=1的初始条件。
主程序
B=2.84;
rhojg=890;
Fr=5650000;
x_plot=[B,100];
z_initial=[0;0;1];
[X,Z] = ode45(@(x,z)fun_z(x,z,B,rhojg,Fr),x_plot,z_initial,[]);
plot(X,Z(:,1))
子程序
function dz = fun_z(x,z,B,rhojg,Fr)
dz = zeros(3,1);
dz(1) =z(2);
dz(2) =1/(Fr*B^2)*(1+z(2)^2)^(1/2)*x^2*z(3);
dz(3) =1/B*sqrt(1+z(2)^2)*(...
-1/z(3)^2*(z(3)+(1-z(3))*rhojg)^(1/2)...
+1/(2*z(3))*(z(3)+(1-z(3))*rhojg)^(-1/2)*(1-rhojg)...
)^(-1);
直接运行主程序就可以画出x-y,