ppval and polyval giving different results
8 次查看(过去 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
0 个评论
采纳的回答
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)
%
i=discretize(x,pp.breaks);
polyval(pp.coefs(i,:),x-pp.breaks(i))
Your evaluation
polyval(ppm.coefs(1,:),8750)
is wrong unless pp.breaks(1) is 0.
0 个评论
更多回答(1 个)
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
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)."
另请参阅
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!