spline? interp?

2 vues (au cours des 30 derniers jours)
DMGM Mazzoleni
DMGM Mazzoleni le 8 Sep 2011
hi guys, obviously I have a problem... I have two vectors (x,y) of 30 points each one and I want to plot(x,y). THey rapresent an histeresis graph (so it's NOT a function). Doing PLOT I obtain a squared graph (with linear segments that connect these points), how can I link the points with a smooth curve? PS=remember it's not a function, so the SPLINE command doesn't work!

Réponses (5)

Kelly Kearney
Kelly Kearney le 9 Sep 2011
You can try interpolating both x and y parametrically. This example puts an equal number of new points between each of your old points; you can possibly get a better result if you calculate actual distance along the polygon edge for your original points.
x = [1.1781; 1.1695; 1.1665; 1.1651; 1.1667; 1.1685; 1.1700; 1.1698; 1.1672; 1.1840; 1.2166; 1.2492; 1.2839; 1.3054; 1.3202; 1.3397; 1.3563; 1.3680; 1.3685; 1.3543; 1.3363; 1.3195; 1.3017; 1.2852; 1.2637; 1.2469; 1.2358; 1.2179; 1.1995; 1.1860; 1.1744];
y = [0.6709; 0.6637; 0.6518; 0.6448; 0.6455; 0.6362; 0.6440; 0.6575; 0.6723; 0.7485; 0.7883; 0.7969; 0.7928; 0.7425; 0.7376; 0.7426; 0.7435; 0.7493; 0.7474; 0.7328; 0.7304; 0.7146; 0.6944; 0.6686; 0.6336; 0.6478; 0.6586; 0.6461; 0.6539; 0.6722; 0.6684];
x2 = interp1(0:30, x, linspace(0,30,150), 'spline');
y2 = interp1(0:30, y, linspace(0,30,150), 'spline');
x3 = interp1(0:30, x, linspace(0,30,150), 'pchip');
y3 = interp1(0:30, y, linspace(0,30,150), 'pchip');
plot(x2,y2,'-c', ...
x3,y3,'-g', ...
x,y,'bo');

John D'Errico
John D'Errico le 9 Sep 2011
The common solution is to use a parameteric interpolant.
x=[1.1781; 1.1695; 1.1665; 1.1651; 1.1667; 1.1685; 1.1700; 1.1698; 1.1672; 1.1840; 1.2166; 1.2492; 1.2839; 1.3054; 1.3202; 1.3397; 1.3563; 1.3680; 1.3685; 1.3543; 1.3363; 1.3195; 1.3017; 1.2852; 1.2637; 1.2469; 1.2358; 1.2179; 1.1995; 1.1860; 1.1744];
y=[0.6709; 0.6637; 0.6518; 0.6448; 0.6455; 0.6362; 0.6440; 0.6575; 0.6723; 0.7485; 0.7883; 0.7969; 0.7928; 0.7425; 0.7376; 0.7426; 0.7435; 0.7493; 0.7474; 0.7328; 0.7304; 0.7146; 0.6944; 0.6686; 0.6336; 0.6478; 0.6586; 0.6461; 0.6539; 0.6722; 0.6684];
Compute a cumulative chordal arclength. This should do it:
t = cumsum(sqrt([0;diff(x)].^2 + [0;diff(y).^2]));
Now interpolate x(t) and y(t) using spline, interp1, etc.
A simple solution is to use my interparc code from the FEX, which does it all in one call, then generating equally spaced points along that smooth curve.
newxy = interparc(1000,x,y);
plot(x,y,'o')
hold on
plot(newxy(:,1),newxy(:,2),'-')

Lucas García
Lucas García le 8 Sep 2011
Do you have the curve fitting toolbox?
If so, you can try using the functions cscvn for interpolating the spline and fnplt for plotting it.
As an example, you can try the following code:
x = -15:15;
y = x.*sin(x);
plot(x,y,'o-');
hold on
c = cscvn([x;y]);
fnplt(c,'r')

DMGM Mazzoleni
DMGM Mazzoleni le 9 Sep 2011
No I don't have it :( ... my two vectors are:
eps=[1.1781; 1.1695; 1.1665; 1.1651; 1.1667; 1.1685; 1.1700; 1.1698; 1.1672; 1.1840; 1.2166; 1.2492; 1.2839; 1.3054; 1.3202; 1.3397; 1.3563; 1.3680; 1.3685; 1.3543; 1.3363; 1.3195; 1.3017; 1.2852; 1.2637; 1.2469; 1.2358; 1.2179; 1.1995; 1.1860; 1.1744];
mpar=[0.6709; 0.6637; 0.6518; 0.6448; 0.6455; 0.6362; 0.6440; 0.6575; 0.6723; 0.7485; 0.7883; 0.7969; 0.7928; 0.7425; 0.7376; 0.7426; 0.7435; 0.7493; 0.7474; 0.7328; 0.7304; 0.7146; 0.6944; 0.6686; 0.6336; 0.6478; 0.6586; 0.6461; 0.6539; 0.6722; 0.6684];
plot(eps,mpar,'o-')
I want to reproduce the same curve with 150 points and not with 30.
  1 commentaire
John D'Errico
John D'Errico le 9 Sep 2011
Using eps to name a variable is a terribly bad choice. Try to avoid naming a variable with an existing (and useful) matlab function.

Connectez-vous pour commenter.


DMGM Mazzoleni
DMGM Mazzoleni le 10 Sep 2011
THANKS ALL OF YOU!!

Community Treasure Hunt

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

Start Hunting!

Translated by