Interp3 variables with monotonic increasing values

1 Ansicht (letzte 30 Tage)
Ryan
Ryan am 27 Jul. 2016
Bearbeitet: John BG am 29 Jul. 2016
Hello, I'm trying to interpolate 3 variables in a matrix. I'm trying to use interp3(), but the trouble is the columns aren't monotonic increasing. Heres a sample matrix:
alt, mach, alpha, Cn
0 0.1 -2 0.55
0 0.1 0 0.5
0 0.1 2 0.55
0 1 -2 1.1
0 1 0 1
0 1 2 1.1
1000 0.1 -2 0.8
1000 0.1 0 0.75
1000 0.1 2 0.8
1000 1 -2 1.35
1000 1 0 1.25
1000 1 2 1.35
Say that matrix is A
interp3(A(:,1),A(:,2),A(:,3),A, 500, 0.1, 0)
I want a value of Cn for a given alt, mach, and alpha. Is this possible or do I need to split up matrix to make it more manageable?
Thanks!

Akzeptierte Antwort

John BG
John BG am 28 Jul. 2016
Let me split your data first, to avoid mixing different variables
A=[0 0.1 -2 0.55
0 0.1 0 0.5
0 0.1 2 0.55
0 1 -2 1.1
0 1 0 1
0 1 2 1.1
1000 0.1 -2 0.8
1000 0.1 0 0.75
1000 0.1 2 0.8
1000 1 -2 1.35
1000 1 0 1.25
1000 1 2 1.35]
A=A'
alt=A(1,:);match=A(2,:);alpha=A(3,:);Cn=A(4,:)
Now, when interpolating, it shouldn't be relevant whether your data is 'monotonic' or not. It's the speed of change what matters.
For your alpha signal:
n_alpha1=[1:1:length(alpha)] % time base original signal
r=3;
alpha2=interp(alpha,3) % interpolating, r=3
n_alpha2=[1:1:length(alpha2)] % time base interpolated signal
the following doesn't work because original and interpolated do not have same time base
plot(n_alpha1,alpha,'red',n_alpha2,alpha2,'b','LineWidth',1.5);
to get them same time base:
n_alpha13=[1:r:r*length(alpha)];
f3=figure(3);plot(n_alpha13,alpha,'r',n_alpha2,alpha2,'b','LineWidth',1.5);grid on;
f3.Name='signal alpha';
xlabel('t');ylabel('alpha');
So, as long as you keep same interpolation rate for all your signals, in this example r=3, all your signals will remain aligned, which is you have specifically mentioned in the question.
Repeating for the other 3 signals:
n_alt=[1:1:length(alt)];
alt2=interp(alt,r);
n_alt13=[1:r:r*length(alt)];
n_alt2=[1:1:length(alt2)];
n_Cn=[1:1:length(Cn)];
Cn2=interp(Cn,r);
n_Cn13=[1:r:r*length(Cn)];
n_Cn2=[1:1:length(Cn2)];
n_match=[1:1:length(match)];
match2=interp(match,r);
n_match13=[1:r:r*length(match)];
n_match2=[1:1:length(match2)];
f1=figure(1);plot(n_alt13,alt,'red',n_alt2,alt2,'blue','LineWidth',1.5);grid on;
f1.Name='signal alt';
f2=figure(2);plot(n_match13,match,'red',n_match2,match2,'blue','LineWidth',1.5);grid on;
f2.Name='signal match';
f4=figure(4);plot(n_Cn13,Cn,'red',n_Cn2,Cn2,'blue','LineWidth',1.5);grid on;
f4.Name='signal Cn';
You can repack the signals back to the original format
B=[alt2;match2;alpha2;Cn2];
B=B'
=
1.0e+03 *
0 0.0001 -0.0020 0.0005
0 0.0001 -0.0015 0.0005
0 0.0001 -0.0009 0.0005
0 0.0001 0.0000 0.0005
0 0.0000 0.0012 0.0005
0 0.0000 0.0020 0.0005
-0.0000 0.0001 0.0020 0.0005
-0.0057 0.0004 0.0008 0.0007
-0.0062 0.0007 -0.0008 0.0009
0.0000 0.0010 -0.0020 0.0011
0.0266 0.0011 -0.0021 0.0011
0.0305 0.0010 -0.0014 0.0011
-0.0000 0.0010 0 0.0010
-0.0853 0.0010 0.0014 0.0010
-0.1089 0.0011 0.0021 0.0011
-0.0000 0.0010 0.0020 0.0011
..
there are other commands you may want to have a look, to control the ringing. Linear interpolation can be done with command linspace, but linspace does not take vector inputs, just scalars.
Ryan would you please be so kind to mark my answer as Accepted Answer?
To any other reader, please if you find this answer of any help solving your question,
please click on the thumbs-up vote link,
thanks in advance
John
  2 Kommentare
Ryan
Ryan am 28 Jul. 2016
Hi John,
Thanks for the work. The original point I'm trying to get at is can I use interp3() to find a value (Cn) for my three variables (alt, mach, alpha) without splitting up the matrix? What you explained, and correct me if I'm wrong, was a way to get more data between the discontinuities of each column of data. That's fine work, but I'm really wanting that one value if I plug in three variable values.
Say alt = 500 mach = 0.1 alpha = 0
I'm only interpolating between the alt values 0 and 1000 so looking for a Cn value between 0.5 and 0.75 (using matrix 'A').
That's only one variable. I was thinking I could use interp3 to solve for 3 interpolations.
Please let me know if I totally misinterpreted your work.
John BG
John BG am 29 Jul. 2016
Bearbeitet: John BG am 29 Jul. 2016
you say you want to to interpolate Cn, one of the signals in the, let me call it this way, the bus with 4 signals in your question.
Yet, you also say you want all the other signals aligned so that you can pick one value of Cn, and it should be aligned to those in other signals of the bus, for the same time reference.
So, you really have to interpolate something within the samples of the rest of signals of the bus, even if you think you don't, otherwise different time references mess up the bus.
My guess is that this parallel interpolation you want is one of the reasons why Mathworks issued a compatibility consideration and recommends an alternative
expand the R2013 menu 'Mathematics' otherwise when searching 'interp3' nothing apparently found.
Before knowing about such recommendation, I already showed the basics of you how to 'unpack' the bus, interpolate with same time reference, and 'repack'.
Please feel free to carry on your endeavour along the line you consider suitable. If you think that interp3 is the function you have to use, perhaps other forum users may supply a closed solution.
I would like to close my answer, so if you don't really want to mark my answer as Accepted Answer, or even click on the the thumbs-up, it's going to be ok.
Regards
John BG

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Interpolating Gridded Data finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by