A quick MATLAB snippet to implement shape-preserving rational spline Hermite interpolation.(Cai and Judd, Economic Letters 2012)
Requires MATLAB 2015a or later. (dependency: discretize
)
x = linspace(0.1,3,30).'; z = linspace(0.1,3,300).';
v = log(x);
s = 1./x;
[f,df,d2f] = rationalspline(x,z,v,s);
truf = log(z);
trudf = 1./z;
figure;
tt = tiledlayout(1,2);
nexttile
hold on;
plot(z,f);
plot(z,truf);
legend('Approximated Level','True Level','Location','best');
hold off;
nexttile
hold on;
plot(z,df);
plot(z,trudf);
legend('Approximated Slope','True Slope','Location','best');
hold off;
![Screenshot 2023-08-19 at 7 24 01 AM](https://private-user-images.githubusercontent.com/50336173/261795089-cef69bec-295f-41b6-a939-4d827ccf426f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIzMjA5MDQsIm5iZiI6MTcyMjMyMDYwNCwicGF0aCI6Ii81MDMzNjE3My8yNjE3OTUwODktY2VmNjliZWMtMjk1Zi00MWI2LWE5MzktNGQ4MjdjY2Y0MjZmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MzAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzMwVDA2MjMyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTE3OGQ1MTI5M2VhODM3MmVmMWM2MTM1YTdkNTY5MDE1MzAxOTg1MWI2ZmVjNzk5ZWI1OTQzNmZkNmNmMjM0N2UmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.rwSoFb08kD5qTT6nMUJa1klo71d1MBc3m-dC1YsqsA8)