用matlab编写m文件函数计算半径为r,比重为s(0<s<1)的浮球浸入水中的深度h,输入为r和s,输出的为h

要求:
1)导出h和r、s之间的关系式;
2)程序要求能处理0<s<1范围内的所有值,按照防错程序设计机制,程序要测试输入值s<0和s>0的情况,在程序中要解一个关于h三次多项式方程,要求所编的函数能识别出正确的根;
3)画出h~s的函数关系图。

参考代码(公式推导过程也以注释的形式写在代码中了):

% 1)导出h和r、s之间的关系式;
% 设浮球半径为r,浸入水中的深度h,则水面处的浮球截面半径为
%    R = sqrt( r^2 - (r-h)^2 ) = sqrt( 2*r*h - h^2 )
% 则浸入水中那部分浮球的体积为
%    V = int(pi*R^2, h, 0, h) = PI * h^2 * (r-h/3)
% 整个球的体积为
%    V1 = int(pi*R^2, h, 0, 2*r) = 4/3 * PI * r^3
% 所以方程为
%    h^3 / 3 - r*h^2 + 4/3 * r^3 * s = 0
% 推导完毕。下面是推导公式时用到的代码:
syms r h real;
R=sqrt(2*r*h-h^2);
V = int(pi*R^2, h, 0, h)
V1 = int(pi*R^2, h, 0, 2*r)

% 2)程序要求能处理0<s<1范围内的所有值,按照防错程序设计机制,
%    程序要测试输入值s<0和s>0的情况,在程序中要解一个关于h三
%    次多项式方程,要求所编的函数能识别出正确的根;
prompt = {'浮球半径 r', '比重 s'};
a = inputdlg(prompt, '输入参数', 1, {'10' '0.6'});
if ~isempty(a)
    r = str2num(a{1});
    s = str2num(a{2});
    if s<0 || s>1 || r<=0
        msg = '输入超出合理范围(比重应在0-1之间,半径应为正)';
        errordlg(msg, '输入有误');
    else
        % 解方程,并去除不合理根(复数、负数或超出浮球直径)
        h = roots([1/3 -r 0 4/3*r^3*s]);
        h = h( imag(h) <= eps );
        h = h( h>0 & h<2*r );
        % 输出结果
        info = sprintf('浮球浸入水中的深度 h = %.4g', h);
        msgbox( info, '结果');
    end
end

% 3)画出h~s的函数关系图。
% 方程两端同除以r^3,则可改写为
%    1/3 * (h/R)^3 - (h/R)^2 + 4/3 * s = 0
% 以s为横坐标,h/r为纵坐标,则可以使用ezplot函数绘图:
ezplot('1/3*y^3-y^2+4/3*x',[0 1],[0 2])
xlabel('比重s')
ylabel('入水深度与浮球半径之比 h/R')
title('1/3 (h/R)^3 - (h/R)^2 + 4/3 s = 0')

 

 h~s的函数关系图:

温馨提示:答案为网友推荐,仅供参考