2.表14.8给出了在低潮时某一平面区域内若干点(x,y)处的水深z值(单位:ft).已知船的吃水深度为5 ft.试画出海底的地貌图,并在平面矩形区域(80,196)×(--70,145)内标注哪些地方船要避免进入. 表14.8 水域坐标数据 单位:ft x 129.0 140.5 103.5 88.0 185.5 195.0 105.5 157.5 107.5 77.0 81.0 162.0 162.0 117.5 y 7.5 141.5 23.0 147.0 22.5 137.5 85.5 -6.5 -81.0 3.0 56.5 -66.5 84.0 -33.5 z 4 8 6 8 6 8 8 9 9 8 8 9 4 9
时间: 2024-01-02 16:02:40 浏览: 105
很抱歉,作为一个语言模型 AI,我无法为您绘制地貌图。但是,您可以根据表14.8中给出的数据,绘制出相应的地貌图。根据题意,船的吃水深度为5 ft,因此船只能在水深大于5 ft 的区域行驶。在平面矩形区域(80,196)×(--70,145)内,您需要找出所有水深大于5 ft 的点,并标注在地貌图上,这些点表示船只可以在这些区域行驶,其他区域船只需要避免进入。希望我的回答能够帮到您!
相关问题
用MATLAB实现下面这道题: 已知直升飞机旋转机翼外形曲线轮廓线上的某些型值点及端点处的一阶导数值。(当k取0到18的整数时,x分别取0.52,3.1,8,17.95,28.65,39.62,50.65,,7,104.6,156.6,208.6,260.7,312.5,364.4,416.3,468,494,507,520;y分别取5.28794,9.4,13.8420.2,24.9,28.44,31.1,35,36.5,36.6,34.6,31,26.34,20.9,14.8,7.8,3.7,1.5,0.2。y在x0处的一阶导为1.86548,y在x18处的一阶导为-0.046115)试计算该曲线上横坐标为2,4,6,12,16,30,60,110,180,280,400,515处点的纵坐标(要求该曲线具有二阶光滑度)。 要求:1.用三次样条插值法 2.求出三次样条插值函数并进行曲线拟合3.输出结果 4.带有注释的代码
以下是MATLAB代码:
```matlab
% 已知数据
k = 0:18;
x = [0.52,3.1,8,17.95,28.65,39.62,50.65,57,104.6,156.6,208.6,260.7,312.5,364.4,416.3,468,494,507,520];
y = [5.28794,9.4,13.8,220.2,24.9,28.44,31.1,35,36.5,36.6,34.6,31,26.34,20.9,14.8,7.8,3.7,1.5,0.2];
dy1 = 1.86548;
dyn = -0.046115;
% 计算自然边界条件下的三次样条插值
spline_coef = spline(x, [dy1, y, dyn]);
% 求出三次样条插值函数并进行曲线拟合
xx = linspace(x(1), x(end), 1000);
yy = ppval(spline_coef, xx);
% 输出结果
xq = [2, 4, 6, 12, 16, 30, 60, 110, 180, 280, 400, 515];
yq = ppval(spline_coef, xq);
disp(['横坐标为', num2str(xq)]);
disp(['纵坐标为', num2str(yq)]);
% 绘制插值曲线和插值点
figure;
plot(x, y, 'o', xq, yq, 's', xx, yy);
legend('型值点', '插值点', '插值曲线');
xlabel('x');
ylabel('y');
```
代码解释:
1. 首先,我们给出已知数据,包括采样点的横坐标和纵坐标,以及端点处的一阶导数值。
2. 然后,我们使用MATLAB内置的`spline`函数,计算自然边界条件下的三次样条插值。这里将一阶导数值放在了插值点的左右两侧,以满足自然边界条件。
3. 接着,我们使用`ppval`函数,计算插值函数在一系列等距的横坐标点上的函数值,以进行曲线拟合。这里我们选择了在采样区间内均匀分布的1000个点作为拟合点。
4. 然后,我们输出所求插值点的纵坐标。
5. 最后,我们使用`plot`函数,绘制插值曲线和插值点,并添加图例和坐标轴标签。
注意:这里的`spline`和`ppval`函数的使用方法与之前的代码相同。需要注意的是,在绘制插值曲线时,我们选择了在采样区间内均匀分布的1000个点,以获得更加平滑的曲线。如果您需要更高精度的插值结果,可以适当增加拟合点的数量。
优化这段代码y=[5.28794 9.4 13.84 20.2 24.9 28.44 31.1 35 36.5 36.6 34.6 31.0 26.34 20.9 14.8 7.8 3.7 1.5 0.2]; %输入x变量的值 x=[0.52 3.1 8.0 17.95 28.65 39.62 50.65 78 104.6 156.6 208.6 260.7 312.5 364.4 416.3 468 494 507 520]; %输入y变量的值 h=diff(x);p=diff(y); %计算步长和Δy f=p./h; %计算一阶差商 for i=1:17 u(i)=h(i)/(h(i+1)+h(i));%计算μ l(i)=1-u(i);%计算λ g(i)=6*(f(i+1)-f(i))/(h(i)+h(i+1)) ;%计算g end g0=6*(f(1)-1.86548)/h(1);%计算g(0) gn=6*(-0.046115-f(18))/h(18);%计算g(n) G=zeros(19,1); G(1)=g0;G(19)=gn;%定义列向量g b=zeros(19,19);%定义一个零矩阵 b(1,1)=2;b(1,2)=1;b(19,19)=2;b(19,18)=1; for i=1:17 %给零矩阵赋值 G(i+1)=g(i); b(i+1,i)=u(i); b(i+1,i+1)=2; b(i+1,i+2)=l(i); end M=b\G;%求出M的值 M=M';%下一步进行函数拟合,求解出M x1=[2 4 6 12 16 30 60 110 180 280 400 515];%输入要求的x for i=1:19 for j=1:12 if(x1(j)>=x(i))&&(x1(j)<=x(i+1)) s(j)=M(i)*power((x(i+1)-x1(j)),3)/(6*h(i))+M(i+1)*power((x1(j)-x(i)),3)/(6*h(i))+(y(i)-M(i)/6*h(i)*h( i))*(x(i+1)-x1(j))/h(i)+(y(i+1)-M(i+1)/6*h(i)*h(i))*(x1(j)-x(i))/h(i); end end end %使用循环结构算出表达式,最后求值 s plot(x,y,'o');%绘制原始数据散点图 hold on;%保留图形 plot(x1,s,'r')%绘制拟合后的图形 title('三次样条插值');%添加标题 legend('插值样点','三次插值样条曲线');%在坐标区右上方添加图例,指明描述
这段代码中可以进行如下优化:
1. 可以将计算步长和Δy合并到一行代码中,避免不必要的赋值操作:
```
p = diff(y);
h = diff(x);
```
2. 可以使用向量化的方式计算一阶差商f,避免使用循环结构:
```
f = diff(y) ./ diff(x);
```
3. 在计算μ和λ的循环中,可以使用向量化的方式计算出u和l,避免使用循环结构:
```
u = h(1:17) ./ (h(2:18) + h(1:17));
l = 1 - u;
```
4. 在计算s的循环中,可以使用向量化的方式计算出s,避免使用嵌套循环:
```
s = zeros(1, 12);
for i = 1:17
index = find(x1 >= x(i) & x1 <= x(i+1));
s(index) = M(i) * power((x(i+1)-x1(index)),3)/(6*h(i)) ...
+ M(i+1) * power((x1(index)-x(i)),3)/(6*h(i)) ...
+ (y(i)-M(i)/6*h(i)*h(i))*(x(i+1)-x1(index))/h(i) ...
+ (y(i+1)-M(i+1)/6*h(i)*h(i))*(x1(index)-x(i))/h(i);
end
```
整合后的代码如下:
```
y = [5.28794 9.4 13.84 20.2 24.9 28.44 31.1 35 36.5 36.6 34.6 31.0 26.34 20.9 14.8 7.8 3.7 1.5 0.2];
x = [0.52 3.1 8.0 17.95 28.65 39.62 50.65 78 104.6 156.6 208.6 260.7 312.5 364.4 416.3 468 494 507 520];
p = diff(y);
h = diff(x);
f = p ./ h;
u = h(1:17) ./ (h(2:18) + h(1:17));
l = 1 - u;
g = 6 * (f(2:18) - f(1:17)) ./ (h(2:18) + h(1:17));
g0 = 6 * (f(1) - 1.86548) / h(1);
gn = 6 * (-0.046115 - f(18)) / h(18);
G = [g0; g; gn];
B = zeros(19);
B(1, 1:2) = [2 1];
B(19, 18:19) = [1 2];
for i = 1:17
B(i+1, i:i+2) = [u(i) 2 l(i)];
end
M = B \ G;
M = M';
x1 = [2 4 6 12 16 30 60 110 180 280 400 515];
s = zeros(1, 12);
for i = 1:17
index = find(x1 >= x(i) & x1 <= x(i+1));
s(index) = M(i) * power((x(i+1)-x1(index)),3)/(6*h(i)) ...
+ M(i+1) * power((x1(index)-x(i)),3)/(6*h(i)) ...
+ (y(i)-M(i)/6*h(i)*h(i))*(x(i+1)-x1(index))/h(i) ...
+ (y(i+1)-M(i+1)/6*h(i)*h(i))*(x1(index)-x(i))/h(i);
end
plot(x, y, 'o');
hold on;
plot(x1, s, 'r');
title('三次样条插值');
legend('插值样点', '三次插值样条曲线');
```
阅读全文