I can't find the mistake in the code

조회 수: 1 (최근 30일)
Jesus Alejandro Rodriguez Morales
답변: Alberto Zekry 2020년 10월 14일
The following code takes a vector of coefficient p, defines a function that returns the value of the polynomial given the scalar input x, and returns a function to handle it. However, when the code is assessed with random polynomials fails. For example, "Incorrect answer for pf = poly_fun([ 0 6 7 5 0 8 1 8 6 -7 -4 ])". Any suggestions?
Thanks in advance,
function fh = poly_fun(p)
function polynomial = poly(x)
n = length(p)-1;
polynomial = sum(p.*x.^(n:-1:0));
end
fh = @poly;
end

채택된 답변

Steven Lord
Steven Lord 2020년 9월 20일
I've seen two different conventions for representing polynomials as vectors of coefficients. The one used by functions like polyfit and polyval has the high order term as the first element.
p = [1 2 3];
x = 4;
v1 = polyval(p, x) % x^2+2*x+3 evaluated at x = 4 is 27
The other has the high order term as the last element.
v2 = p(1)+x*p(2)+x.^2*p(3) % 1+2*x+3*x^2 evaluated at x = 4 is 57
Based on the fact that the sample polynomial used in the grading of your assignment has 0 as its first element, I'm wondering if they're using the latter convention.
Alternately, does your assignment say your function should return a function handle or the numeric result of evaluating that polynomial?
  댓글 수: 1
Jesus Alejandro Rodriguez Morales
Thank you for your answer, Steven. Yeah, the function should return a function handle and after we put the value of x should show the numeric result. For example, if I run the following values works perfectly.
pf = poly_fun(1:5);
pf(1)
pf = poly_fun(ones(1,10));
pf(2)
But, when the grader run something like pf = poly_fun([ -10 5 0 -4 -4 2 -2 10 -6 ]) my function fail the test.

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

추가 답변 (3개)

Thiago Henrique Gomes Lobato
Thiago Henrique Gomes Lobato 2020년 9월 20일
You can't use "abs" since the coefficients/x values can be negative.
  댓글 수: 2
Jesus Alejandro Rodriguez Morales
Thanks for the observation, the code was without the "abs", I just edited. Any suggestions?
Thiago Henrique Gomes Lobato
Thiago Henrique Gomes Lobato 2020년 9월 20일
Depending of your inputs the direction of the sum may be wrong. This code is basically the same as yours but using the "(... ,2)" in the sum so the dimensions are right:
n = length(p)-1;
polynomial = @(x,p)(sum(p.*x.^((length(p)-1):-1:0),2 ));
A = polynomial( [-1:0.01:1]',[ 0 6 7 5 0 8 1 8 6 -7 -4 ] ); % Note the array dimensions
B = polyval([ 0 6 7 5 0 8 1 8 6 -7 -4 ],[-1:0.01:1]');
norm(A-B) % Compare with matlab polyval
ans =
1.9746e-14

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


Hèrren Thomas D'Souza
Hèrren Thomas D'Souza 2020년 9월 27일
If you workout the algorithm on a piece of paper or mentally by giving smaller arrays as input co-effcients like,
>> z = poly_fun([-1,2])
>> ans = z(2)
You'll now understand clearly how polynomial = sum(p.*x.^(n:-1:0)); is working.
For your logic to work, you can use, flip(p) before the nested function. Or you can use the same sum function to iterate from 0, without needing to flip.

Alberto Zekry
Alberto Zekry 2020년 10월 14일
function fh = poly_fun(p)
polynomial=0
function polynomial = poly(x)
polynomial=polyval(p(end:-1:1),x);
end
fh = @poly;
end

카테고리

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

태그

제품


릴리스

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by