ppval and polyval giving different results

12 次查看(过去 30 天)
I created a piecewise polynomial using mkpp. But when I evaluate a set of points I get incorrect results using ppval, although polyval() gives correct result. Looks like I'm missing something. Any idea what that is?
Thanks!
>> ppm
ppm =
struct with fields:
form: 'pp'
breaks: [749.5 16747 32768 48771 64784]
coefs: [4×2 double]
pieces: 4
order: 2
dim: 1
K>> ppm.coefs
ans =
0.00031269 -10.246
0.00031268 -10.246
0.00031274 -10.247
0.00031265 -10.245
>> ppval(ppm,ppm.breaks(1))
ans =
-10.246
>> polyval(ppm.coefs(1,:),ppm.breaks(1))
ans =
-10.012
>> polyval(ppm.coefs(1,:),8750)
ans =
-7.51
>> ppval(ppm,8750)
ans =
-7.7444

采纳的回答

Bruno Luong
Bruno Luong 2022-4-19
编辑:Bruno Luong 2022-4-19
Here is a correct way to know how ppval works
pp=spline(cumsum(rand(1,10)),rand(1,10));
x=3;
ppval(pp,x)
ans = 2.1433
%
i=discretize(x,pp.breaks);
polyval(pp.coefs(i,:),x-pp.breaks(i))
ans = 2.1433
Your evaluation
polyval(ppm.coefs(1,:),8750)
is wrong unless pp.breaks(1) is 0.

更多回答(1 个)

Torsten
Torsten 2022-4-19
I think you fed "polyval" with the coefficients cut to a certain number of digits.
You must use the coefficients in full precision to get equal results from ppval and polyval.
  6 个评论
Bruno Luong
Bruno Luong 2022-4-19
"And I don't think you must recalculate them for the shifted polynomial."
You are wrong here is the doc of mkpp
"Polynomial coefficients, specified as an L-by-k matrix with the ith row coefs(i,:) containing the local coefficients of an order k polynomial on the ith interval, [breaks(i), breaks(i+1)]. In other words, the polynomial is coefs(i,1)*(X-breaks(i))^(k-1) + coefs(i,2)*(X-breaks(i))^(k-2) + ... + coefs(i,k-1)*(X-breaks(i)) + coefs(i,k)."
Torsten
Torsten 2022-4-19
You are right. This also explains the deviations in the breakpoints themselves.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Interpolation 的更多信息

标签

产品

Community Treasure Hunt

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

Start Hunting!

Translated by