Evaluate a Polynomial without polyval

조회 수: 7 (최근 30일)
Louis Vertosnik
Louis Vertosnik 2017년 5월 5일
댓글: Dillen.A 2018년 2월 27일
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
  댓글 수: 1
Guillaume
Guillaume 2018년 2월 23일
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.

댓글을 달려면 로그인하십시오.

답변 (3개)

Walter Roberson
Walter Roberson 2017년 5월 5일
In your line
for q=orderofp:-1:0
xtothepower= x^q;
end
you are overwriting all of xtothepower each iteration.

Dillen.A
Dillen.A 2018년 2월 23일
편집: Dillen.A 2018년 2월 23일
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.
  댓글 수: 3
Guillaume
Guillaume 2018년 2월 23일
A truly generic version (works with any n-dimension x array), using the same algorithm:
pv = @(p, x) sum(shiftdim(p(:), -ndims(x)) .* x .^ shiftdim((numel(p)-1:-1:0).', -ndims(x)), ndims(x)+1)
Dillen.A
Dillen.A 2018년 2월 27일
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
Roger Stafford 2018년 2월 24일
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

카테고리

Help CenterFile Exchange에서 Polynomials에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by