フィルターのクリア

FInd maximum in cubic spline interpolant

19 ビュー (過去 30 日間)
YJ
YJ 2014 年 3 月 26 日
編集済み: John D'Errico 2017 年 12 月 12 日
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,

採用された回答

Andrei Bobrov
Andrei Bobrov 2014 年 3 月 26 日
編集済み: Andrei Bobrov 2014 年 3 月 27 日
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+');

その他の回答 (2 件)

Mark Kittisopikul
Mark Kittisopikul 2017 年 12 月 12 日
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');

John D'Errico
John D'Errico 2017 年 12 月 12 日
編集済み: John D'Errico 2017 年 12 月 12 日
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.

カテゴリ

Help Center および File ExchangeSpline Postprocessing についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by