How to generate new result points based on known model curve?

1 visualización (últimos 30 días)
Andrei
Andrei el 26 de Oct. de 2024
Comentada: John D'Errico el 26 de Oct. de 2024
Hi All,
i do have an existing curve built based on known x and y.
I want to use the model curve to generate new data points. considering:
x=[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
and y with lower and upper limits of:
y=[109.601, ... , 10.96007]
On model curve point 570 & 26.5 would correspond to 100 & 109.601 while point 138 & 385.1 to 10 & 10.96007
Existing curve based on:
x=[570, 565.2, 560.4, 555.6, 550.8, 546, 541.2, 536.4, 531.6, 526.8, 522, 517.2, 512.4, 507.6, 502.8, 498, 493.2, 488.4, 483.6, 478.8, 474, 469.2, 464.4, 459.6, 454.8, 450, 445.2, 440.4, 435.6, 430.8, 426, 421.2, 416.4, 411.6, 406.8, 402, 397.2, 392.4, 387.6, 382.8, 378, 373.2, 368.4, 363.6, 358.8, 354, 349.2, 344.4, 339.6, 334.8, 330, 325.2, 320.4, 315.6, 310.8, 306, 301.2, 296.4, 291.6, 286.8, 282, 277.2, 272.4, 267.6, 262.8, 258, 253.2, 248.4, 243.6, 238.8, 234, 229.2, 224.4, 219.6, 214.8, 210, 205.2, 200.4, 195.6, 190.8, 186, 181.2, 176.4, 171.6, 166.8, 162, 157.2, 152.4, 147.6, 142.8, 138]
y=[26.5, 36.5, 46.3, 55.9, 65.2, 74.3, 83.2, 91.8, 100.2, 108.4, 116.4, 124.2, 131.8, 139.2, 146.4, 153.5, 160.3, 167, 173.5, 179.9, 186.1, 192.1, 198, 203.7, 209.3, 214.8, 220.1, 225.3, 230.3, 235.2, 240, 244.7, 249.2, 253.7, 258, 262.2, 266.3, 270.3, 274.2, 278.1, 281.8, 285.4, 288.9, 292.4, 295.7, 299, 302.2, 305.3, 308.3, 311.2, 314.1, 316.9, 319.6, 322.3, 324.9, 327.4, 329.9, 332.3, 334.6, 336.9, 339.1, 341.3, 343.4, 345.5, 347.5, 349.4, 351.4, 353.2, 355, 356.8, 358.5, 360.2, 361.8, 363.4, 365, 366.5, 368, 369.4, 370.8, 372.2, 373.5, 374.8, 376.1, 377.3, 378.5, 379.7, 380.9, 382, 383.1, 384.1, 385.1]
Thank you.

Respuestas (1)

dpb
dpb el 26 de Oct. de 2024
Editada: dpb el 26 de Oct. de 2024
x=[570, 565.2, 560.4, 555.6, 550.8, 546, 541.2, 536.4, 531.6, 526.8, 522, 517.2, 512.4, 507.6, 502.8, 498, 493.2, 488.4, 483.6, 478.8, 474, 469.2, 464.4, 459.6, 454.8, 450, 445.2, 440.4, 435.6, 430.8, 426, 421.2, 416.4, 411.6, 406.8, 402, 397.2, 392.4, 387.6, 382.8, 378, 373.2, 368.4, 363.6, 358.8, 354, 349.2, 344.4, 339.6, 334.8, 330, 325.2, 320.4, 315.6, 310.8, 306, 301.2, 296.4, 291.6, 286.8, 282, 277.2, 272.4, 267.6, 262.8, 258, 253.2, 248.4, 243.6, 238.8, 234, 229.2, 224.4, 219.6, 214.8, 210, 205.2, 200.4, 195.6, 190.8, 186, 181.2, 176.4, 171.6, 166.8, 162, 157.2, 152.4, 147.6, 142.8, 138];
y=[26.5, 36.5, 46.3, 55.9, 65.2, 74.3, 83.2, 91.8, 100.2, 108.4, 116.4, 124.2, 131.8, 139.2, 146.4, 153.5, 160.3, 167, 173.5, 179.9, 186.1, 192.1, 198, 203.7, 209.3, 214.8, 220.1, 225.3, 230.3, 235.2, 240, 244.7, 249.2, 253.7, 258, 262.2, 266.3, 270.3, 274.2, 278.1, 281.8, 285.4, 288.9, 292.4, 295.7, 299, 302.2, 305.3, 308.3, 311.2, 314.1, 316.9, 319.6, 322.3, 324.9, 327.4, 329.9, 332.3, 334.6, 336.9, 339.1, 341.3, 343.4, 345.5, 347.5, 349.4, 351.4, 353.2, 355, 356.8, 358.5, 360.2, 361.8, 363.4, 365, 366.5, 368, 369.4, 370.8, 372.2, 373.5, 374.8, 376.1, 377.3, 378.5, 379.7, 380.9, 382, 383.1, 384.1, 385.1];
hAx=subplot(2,1,1);
plot(x,y,'x')
xlabel('X'),ylabel('Y')
ix=find(x==138); % locate the two target points; find the second
[x(ix) y(ix)]
ans = 1×2
138.0000 385.1000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
hold on
ix=[1;ix]; % the first is by inspection; same idea as above if not
scatter(x(ix),y(ix),'r','filled') % show them on plot
% 570 & 26.5 would correspond to 100 & 109.601 while point 138 & 385.1 to 10 & 10.96007
X=[100;10]; % desired scaled X, Y end points
Y=[109.601;10.96007];
bx=polyfit(x(ix),X,1); % the linear mapping of x-->X range
by=polyfit(y(ix),Y,1); % and ditto for y-->Y
xs=polyval(bx,x); % new x at each previous
ys=polyval(by,y); % ditto y
hAx(2)=subplot(2,1,2);
plot(xs,ys,'*') % plot the rescaled results
xlabel('Xscaled'),ylabel('Yscaled')
xlim(polyval(bx,xlim(hAx(1)))), ylim([0 120]), grid on % set xlim to match unscaled to compare
You can fit the transformed data to some interpolating function or just interpolate with the new data arrays over the scaled range; your choice.
The "trick" is to just do a linear transformation from one scale to the other; with the two points one can calculate the two slopes and interecepts by hand, but in MATLB it's simpler to just use the builtin poly function twins...

Categorías

Más información sobre Linear and Nonlinear Regression en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by