Evaluate a Polynomial without polyval

9 ビュー (過去 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 Center および File ExchangePolynomials についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by