# Evaluate a Polynomial without polyval

34 views (last 30 days)
Louis Vertosnik on 5 May 2017
Commented: Dillen.A on 27 Feb 2018
I need to create a user defined function that evaluates a vector of the coeficients of a polynomial and a given x value without using the polyval function.
This is what I have so far:
function accum =mypolyval(p,x)
accum = 0;
orderofp = length(p)-1;
n=1:length(p);
for i=1:length(p)
for q=orderofp:-1:0
xtothepower= x^q;
end
y(i) = accum+p(i)*xtothepower;
accum = y(i);
end
end
Guillaume on 23 Feb 2018
Note that even without polyval you can evaluate a polynomial in just one line, without the need for a loop (the only functions needed are sum, numel, .^, .* and :)
However, I assume that you have to use a loop for your assignment.

Walter Roberson on 5 May 2017
for q=orderofp:-1:0
xtothepower= x^q;
end
you are overwriting all of xtothepower each iteration.

Dillen.A on 23 Feb 2018
Edited: Dillen.A on 23 Feb 2018
For anyone still interested in this, my quick solution:
pv=@(p,x) sum(permute(p,[1,3,2]).*(x.^permute(0:length(p)-1,[1,3,2])),3)
y=pv(p,x)
Should work for any 2D matrix, I used permute rather than reshape assuming it is faster. for 3D data you can use [1,2,4,3] in your permute, and then sum over the 4th dim, and so on. polyval is still faster.
Dillen.A on 27 Feb 2018
Thanks for the knowledge. I simply forgot that p was "the wrong way around" as I always remember the expansion as a0 + a1.*x + a2.*x.^2 + ...
Also good to know that reshape is quicker.

Roger Stafford on 24 Feb 2018
Note that you can avoid the necessity of computing powers of x in the following. It works even if x is an array. It should save some computing time.
y = repmat(p(1),size(x));
for k = 2:length(p)
y = y.*x+p(k);
end