2016-12-06 23 views
0

我有以下數據預測兩條曲線中間有不同方程和數據的曲線。我還需要對中間的曲線進行樣條曲線曲線 我試過在stackoverflow中搜索其他代碼,但這是最接近正確的解決方案。到目前爲止,兩條曲線的曲線是正確的,但插值點給了我錯誤的曲線。plot在matlab中的2種不同類型的曲線之間插入一條曲線

假設(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-'); 
+0

我建議你看看這個問題(和答案):[兩條曲線之間的插值](http://stackoverflow.com/questions/23494254/interpolation-between-two-curves-matlab/23497688#23497688) – Hoki

+0

已經在那裏,並嘗試使用thos我的數據e代碼,但會生成差異結果。我只需要解決上面的代碼,因爲到目前爲止,這個解決方案是最接近我的問題。 – user183060

回答

0

的問題和意見答題鏈接仍然適用,可以是一個解決方案。

就你而言,它不是那麼直接,因爲你的數據不在同一個網格上,有些不是單調的,但是一旦它們被正確打包,最簡單的解決方案仍然是使用griddata。通過正確打包,我的意思是找到最大公共間隔(在x上,或者你所謂的a),所以數據可以在曲線之間插值而不產生NaN s。

這似乎工作: curve interp 紅色虛線是在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) 
+0

這是完美的@Hoki。我怎樣才能得到C30的插值數據? – user183060

0

有相當與您的代碼,這就是爲什麼它沒有被正確執行的幾個問題。我剛纔提出你的代碼非常小的變化,並使其運行,

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

  • 有跡象表明,重複將其產生的a50(0.931818182)值出現以下錯誤
  • 網格矢量並非嚴格單調遞增。

    我改變的價值之一,並與0.932

    輸出取代了它是不是有前途的,但假設你想要的?

    enter image description here

    +0

    是的,這是最接近的,但我需要紅色曲線與其他兩個相同。你能否檢查在這個其他解決方案的錯誤也在哪裏。謝謝 – user183060

    +0

    @ user183060如果我能我會嗎? – zhk

    +0

    謝謝。我還編輯了代碼'interpVel = vel25_inter +(vel50_inter-vel25_inter)/(50-25)'。我認爲這是問題出現的地方。 – user183060