【问题标题】:plot interpolate a curve between 2 different types of curves in matlab在matlab中绘制2种不同类型曲线之间的曲线
【发布时间】:2016-12-06 07:12:35
【问题描述】:

我有以下数据预测两条曲线中间的曲线,它有不同的方程和数据。我还需要对中间曲线的曲线进行样条曲线和平滑处理 我尝试在 stackoverflow 中搜索其他代码,但这是最接近正确的解决方案。到目前为止,两条曲线的图是正确的,但插值点给了我错误的图。

鉴于 (a25,vel25)=25 和 (a50,vel50)=50,我试图找到 val=30 的图。请帮我排除故障并获取生成的插值曲线的数据表 (x,y)。谢谢你的帮助 generated plot using this program

a50=[1.05
0.931818182
0.931818182
0.968181818
1.045454545
1.136363636
1.354545455
1.568181818
1.718181818
1.945454545
2.159090909
2.454545455
2.772727273
];
vel50=[0.85
0.705555556
0.605555556
0.533333333
0.472222222
0.45
0.427777778
0.45
0.477777778
0.533333333
0.611111111
0.711111111
0.827777778
];
a25=[0.5
0.613636364
0.686363636
0.795454545
0.918181818
0.963636364
1.090909091
1.236363636
1.304545455
1.431818182
1.545454545
1.659090909
1.818181818
];
vel25=[0.425555556
0.354444444
0.302222222
0.266666667
0.233333333
0.226666667
0.211111111
0.222222222
0.237777778
0.266666667
0.311111111
0.35
0.402222222
];
plot(a25,vel25,'b-');
hold on
plot(a50,vel50,'g-');
minX = min([a25 a50]);
maxX = max([a25,a50]);
xx = linspace(minX,maxX,100);
vel25_inter = interp1(a25,vel25,xx);
vel50_inter = interp1(a50,vel50,xx);
val = 30; % The interpolated point
interpVel = vel25_inter + ((val-25).*(vel50_inter-vel25_inter))./(50-25);
plot(xx,interpVel,'r-');

【问题讨论】:

  • 我建议你看看这个问题(和答案):Interpolation between two curves
  • 已经在那里并使用这些代码尝试了我的数据,但它会产生差异结果。我只需要对上面的代码进行故障排除,因为到目前为止,这个解决方案最接近我的问题。

标签: matlab plot


【解决方案1】:

评论中链接的问题和答案仍然适用,可以作为解决方案。

在你的情况下,它不是那么直接,因为你的数据不在同一个网格上并且有些不是单调的,但是一旦它们被正确打包,最简单的解决方案仍然是使用griddata

通过正确打包,我的意思是找到最大公共区间(在x,或您所说的a),因此数据可以在曲线之间插值而不会产生NaNs。

这似乎有效: 红色虚线是在val=30 处插值的值,所有其他线是在 25 到 50 之间的值的插值。

到达那里的代码:

% back up original data, just for final plot
bkp_a50 = a50 ; bkp_vel50 = vel50 ;

% make second x vector monotonic
istart = find( diff(a50)>0 , 1 , 'first') ;
a50(1:istart-1) = [] ;
vel50(1:istart-1) = [] ;

% prepare a 3rd dimension vector (from 25 to 50)
T = [repmat(25,size(a25)) ; repmat(50,size(a50)) ] ;
% merge all observations together
A = [  a25 ;   a50] ;
V = [vel25 ; vel50] ;

% find the minimum domain on which data can be interpolated
% (anything outside of that will return NaN)
Astart = max( [min(a25) min(a50)] ) ;
Astop  = min( [max(a25) max(a50)] ) ;

% use the function 'griddata'
[TI,AI] = meshgrid( 25:50 , linspace(Astart,Astop,10)  ) ; 
VI = griddata(T,A,V,TI,AI) ;

% plot all the intermediate curves
plot(AI,VI)
hold on
% the original curves
plot(a25,vel25,'--k','linewidth',2)
plot(bkp_a50,bkp_vel50,'--k','linewidth',2)
% Highlight the curve at T = 30 ;
c30 = find( TI(1,:) == 30 ) ;
plot(AI(:,c30),VI(:,c30),'--r','linewidth',2)

【讨论】:

  • 这是完美的@Hoki。如何获得 c30 的插值数据?
【解决方案2】:

您的代码存在很多问题,这就是它无法正常执行的原因。我刚刚对您的代码进行了很少的更改并使其运行,

clc
%13
a50=[1.05
0.931818182
0.932
0.968181818
1.045454545
1.136363636
1.354545455
1.568181818
1.718181818
1.945454545
2.159090909
2.454545455
2.772727273
];
%13
vel50=[0.85
0.705555556
0.605555556
0.533333333
0.472222222
0.45
0.427777778
0.45
0.477777778
0.533333333
0.611111111
0.711111111
0.827777778
];
%13
a25=[0.5
0.613636364
0.686363636
0.795454545
0.918181818
0.963636364
1.090909091
1.236363636
1.304545455
1.431818182
1.545454545
1.659090909
1.818181818
];
%13
vel25=[0.425555556
0.354444444
0.302222222
0.266666667
0.233333333
0.226666667
0.211111111
0.222222222
0.237777778
0.266666667
0.311111111
0.35
0.402222222
];
plot(a25,vel25,'b-');
hold on
plot(a50,vel50,'g-');
minX = min([a25 a50])
maxX = max([a25 a50])
%xx = linspace(minX,maxX);
xx = linspace(0.5,2.7727,100);
vel25_inter = interp1(a25,vel25,xx);
vel50_inter = interp1(a50,vel50,xx);
val = 30; % The interpolated point
interpVel = vel25_inter + ((val-25).*(vel50_inter-vel25_inter))./(50-25);
plot(xx,interpVel,'r-');

有问题

  1. 您想要插值的时间间隔是 xx = linspace(minX,maxX);,但它给出了类型错误,

矩阵尺寸必须一致。

因为您为起点分配了两个值,为终点分配了两个值。所以我用xx = linspace(0.5,2.7727,100); 替换它,起点是两个最小值minX 中的最小值,maxX 也是如此

  1. a50 (0.931818182) 的值重复,导致以下错误

网格向量不是严格单调递增的。

我更改了其中一个值并将其替换为0.932

输出不是那么有希望,但假设是你想要的?

【讨论】:

  • 是的,这是最接近的,但我需要红色曲线与其他两条曲线相同。你能检查一下这个其他解决方案的错误在哪里吗?谢谢
  • @user183060 如果可以,我愿意吗?
  • 谢谢。我还编辑了代码 'interpVel =vel25_inter + (vel50_inter-vel25_inter)/(50-25)' 。我认为这是问题开始的地方。
  • @user183060 我尝试过改进我已经拥有的东西,但没有运气。真的对不起队友!。我希望这个论坛上的其他人会提出你想要的答案。祝你好运!
  • 感谢您的帮助。我真的希望其他人会注意到这一点。
猜你喜欢
  • 2019-08-15
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多