FInd maximum in cubic spline interpolant
    14 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
I got a set of data, x and y
I was trying to find an eqaution that bu basic fitting and it comes out that spline interpolant is the best one to fit in. (quad and cubic has a peak lower than actual value, so i can not use them)
Now, I want an actual equation that represents a line between two point.
Also I want to find a maximum y-value in a line of cubic spline interpolant, not from the actual data.
I tried findpeak, but it display the y-vale from my data.
So is there a way to do it??
x =
    0.7000
    0.7500
    0.8000
    0.8500
    0.9000
    0.9500
    1.0000
    1.0500
    1.1000
    1.1500
    1.2000
    1.2500
    1.3000
y =
1.0e+003 *
    1.8367
    1.9180
    1.9953
    2.0677
    2.1333
    2.1883
    2.2251
    2.2318
    2.2097
    2.1746
    2.1356
    2.0958
    2.0562
plot (x,y)
using basic fit tool, clicked on a spline interpolant
and got stuck from here
Cheers,
0 Commenti
Risposta accettata
  Andrei Bobrov
      
      
 il 26 Mar 2014
        
      Modificato: Andrei Bobrov
      
      
 il 27 Mar 2014
  
      EDIT
new data
x = [0.70000
   0.75000
   0.80000
   0.85000
   0.90000
   0.95000
   1.00000
   1.05000
   1.10000
   1.15000
   1.20000
   1.25000
   1.30000];
y = [1836.7
   1918.0
   1995.3
   2067.7
   2133.3
   2188.3
   2225.1
   2231.8
   2209.7
   2174.6
   2135.6
   2095.8
   2056.2];
for MATLAB R2013a and later
[~,ii] = findpeaks(y);
F = griddedInterpolant(x,y,'spline');
xmaxs = arrayfun(@(xx)fminsearch(@(x)-F(x),xx),x(ii));
x1 = linspace(x(1),x(end),100);
plot(x,y,'go',x1,F(x1),'b-',xmaxs,F(xmaxs),'r+');
for older releases MATLAB
[~,ii] = findpeaks(y);
F = interp1(x,y,'spline','pp');
xmaxs = arrayfun(@(xx)fminsearch(@(x)-ppval(F,x),xx),x(ii));
x1 = linspace(x(1),x(end),100);
plot(x,y,'go',x1,ppval(F,x1),'b-',xmaxs,ppval(F,xmaxs),'r+');
0 Commenti
Più risposte (2)
  Mark Kittisopikul
 il 12 Dic 2017
        You can calculate the maximum by using calculus by finding a zero of the first derivative where the second derivative is negative.
x = [0.70000
0.75000
0.80000
0.85000
0.90000
0.95000
1.00000
1.05000
1.10000
1.15000
1.20000
1.25000
1.30000];
y = [1836.7
1918.0
1995.3
2067.7
2133.3
2188.3
2225.1
2231.8
2209.7
2174.6
2135.6
2095.8
2056.2];
Find the spline interpolant in piecewise polynomial form.
>> sp = spline(x,y)
sp =
struct with fields:
      form: 'pp'
    breaks: [1×13 double]
     coefs: [12×4 double]
    pieces: 12
     order: 4
       dim: 1
Take the derivative of the spline:
>> fnder(sp)
ans =
struct with fields:
      form: 'pp'
    breaks: [1×13 double]
     coefs: [12×3 double]
    pieces: 12
     order: 3
       dim: 1
Find the zeros of the 1st derivative:
>> fnzeros(fnder(sp))
ans =
    1.0352
    1.0352
Confirm the second derivative is negative:
>> fnval(fnder(fnder(sp)),fnzeros(fnder(sp)))
ans =
   1.0e+04 *
   -1.2996
   -1.2996
Check the zero of the first derivative:
>> fnval(fnder(sp),fnzeros(fnder(sp)))
ans =
   1.0e-11 *
    0.2558
    0.2558
Plot a nice figure for visual verification.
 >> figure; fnplt(sp);
  hold on; plot(fnzeros(fnder(sp)),fnval(sp,fnzeros(fnder(sp))),'o');
  grid on
  hold on; plot(fnzeros(fnder(sp)).',ylim.','-');
  hold on; plot(x,y,'ko');

0 Commenti
  John D'Errico
      
      
 il 12 Dic 2017
        
      Modificato: John D'Errico
      
      
 il 12 Dic 2017
  
      Too late possibly, but you can always use my SLM toolbox , which has tools that can operate on splines created by tools like spline or pchip.
Based on the vectors x and y as you posed...
pp = spline(x,y);
[maxf,maxloc] = slmpar(pp,'maxfun')
maxf =
       2233.2
maxloc =
       1.0352
This is the global maximum value of the spline created in pp.
0 Commenti
Vedere anche
Categorie
				Scopri di più su Spline Postprocessing in Help Center e File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



