英文:
Spline interpolation plot in Matlab
问题
我尝试在同一图中输出几个图形,使用不同的插值方法,以找到x = 5时的y,并用红色星号标记该点。我已经完成了线性插值,效果很好(意味着我得到了一个好的图形),但当我尝试输出样条插值图时,效果不太好(正如您所看到的,它只显示了一行星号)。我希望能帮助理解为什么它现在不起作用?
这是我的代码:
clc;
clear;
close all;
% 变量
y = [101.3 106.6 109.4 114.7 116.9 118.2 123.7];
x = [1.69 3.67 4.37 5.45 5.84 6.05 6.90];
% 线性插值以获取v = 5 [m/s]时的压力
pressure = interp1(x, y, 5);
% 样条插值以获取v = 5 [m/s]时的压力
xx = 1.69:6.90;
yy = spline(x, y, 5);
s = interp1(x, y, xx, "spline");
% 线性图输出
hold on;
plot(x, y, 'b.-');
plot(5, pressure, '*');
grid on;
% 样条图输出
hold on;
plot(x, y, 'o');
plot(xx, yy, '*');
英文:
i'm trying to output few graphs in the same plot using different interpolations in order to find the y when x = 5 and mark that point with a red asterisk. I did the linear and it's working good (means i get a good plot) but when i'm trying to output the spline plot it doesn't work very well (as you can see it only shows a line of asterisks). i would appreciate some help with understanding why it is now working?
This is my code:
clc;
clear;
close all;
%variables
y = [101.3 106.6 109.4 114.7 116.9 118.2 123.7];
x = [1.69 3.67 4.37 5.45 5.84 6.05 6.90];
%Linear interpolate to get pressure at v = 5 [m/s]
pressure = interp1(x,y,5)
%Spline interpolate to get pressure at v = 5 [m/s]
xx = 1.69:6.90;
yy = spline(x,y,5)
s = interp1(x,y,xx,"spline");
%linear plot output
hold on;
plot(x,y,'b.-')
plot(5,pressure,'*')
grid on;
%spline plot output
hold on;
plot(x,y,'o')
plot(xx,yy,'*')
答案1
得分: 1
你正在绘制在5处插值的单个结果,yy
。你需要绘制整个xx
域上的插值结果,s
。
你之前在绘图中两次绘制了原始数据。我稍微修改了绘图和注释,使事情更加精确。
y = [101.3 106.6 109.4 114.7 116.9 118.2 123.7];
x = [1.69 3.67 4.37 5.45 5.84 6.05 6.90];
% 线性插值以获取v = 5 [m/s]时的压力
pressure = interp1(x, y, 5);
% 样条插值以获取v = 5 [m/s]时的压力
xx = 1.69:6.90;
yy = spline(x, y, 5);
s = interp1(x, y, xx, "spline");
% 绘制原始数据
plot(x, y, 'b.-');
grid on;
% 线性插值单个点
hold on;
plot(5, pressure, '*');
% 样条插值单个点
plot(5, yy, 'square');
% 样条插值输出
plot(xx, s, '+');
hold off;
请注意,你实际上进行了两次样条插值,一次用于spline
,一次用于interp1(x, y, xx, 'spline')
。从spline
中获取整个样条结构,然后使用ppval
从中提取插值值可能更清晰:
pp = spline(x, y);
yy = ppval(pp, 5);
s = ppval(pp, xx);
英文:
You’re plotting the single result of interpolating at 5, yy
. You need to plot the result of the interpolation across the whole xx
domain, s
.
You were also plotting your original data twice. I cleaned the plotting and comments a bit, to make things more precise.
y = [101.3 106.6 109.4 114.7 116.9 118.2 123.7];
x = [1.69 3.67 4.37 5.45 5.84 6.05 6.90];
%Linear interpolate to get pressure at v = 5 [m/s]
pressure = interp1(x,y,5)
%Spline interpolate to get pressure at v = 5 [m/s]
xx = 1.69:6.90;
yy = spline(x,y,5)
s = interp1(x,y,xx,"spline");
%original data plot
plot(x,y,'b.-')
grid on
%linear interpolation single point
hold on
plot(5,pressure,'*')
%spline interpolation single point
plot(5,yy,'square')
%spline plot output
plot(xx,s,'+')
hold off
Note that you’re actually performing the spline interpolation twice, once for spline
and once for interp1(x,y,xx,'spline')
. It might be cleaner to get the entire spline structure back from spline
and extract your interpolated values from it using ppval
:
pp = spline(x,y);
yy = ppval(pp,5);
s = ppval(pp,xx);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论