蠢茨阈枰钊肜斫鈓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,

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐