I can't find the mistake in the code
4 ビュー (過去 30 日間)
古いコメントを表示
Jesus Alejandro Rodriguez Morales
2020 年 9 月 20 日
回答済み: 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
0 件のコメント
採用された回答
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?
その他の回答 (3 件)
Thiago Henrique Gomes Lobato
2020 年 9 月 20 日
You can't use "abs" since the coefficients/x values can be negative.
2 件のコメント
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
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.
0 件のコメント
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
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Logical についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!