How to evaluate a polynomial p at each point in y?

16 ビュー (過去 30 日間)
Angelavtc
Angelavtc 2020 年 11 月 4 日
コメント済み: Ameer Hamza 2020 年 11 月 6 日
How to evaluate a polynomial p at each point in y? I know polyval(p,x) makes the same but for each point in x, but I would like to know if there exist something similar for y.
Thanks!

採用された回答

Ameer Hamza
Ameer Hamza 2020 年 11 月 4 日
編集済み: Ameer Hamza 2020 年 11 月 4 日
You can use fzero(). For example
p = [1 0 0]; % polynomial y = x.^2
y = 4; % value of y
x_sol = fzero(@(x) polyval(p, x)-y, rand()); % corresponding value of x
Result
>> x_sol
x_sol =
2
  2 件のコメント
Angelavtc
Angelavtc 2020 年 11 月 5 日
編集済み: Angelavtc 2020 年 11 月 5 日
@Ameer Hamza thanks for your answer, it was really useful. But what if I want to do the same for a set of values x,y like the ones I am uploading here.
Lets say for the specific value y=0
I have seen that fzero only works for functions. What to do then?
Thanks in advance!
Ameer Hamza
Ameer Hamza 2020 年 11 月 6 日
There can be several ways, but I would use interpolation to convert the series of 'x' and 'y' points into a continuous function and then apply fzero()
fun = @(xq) interp1(x, y, xq);
x_sol = fzero(@(xq) fun(xq)-0, mean(x)); % mean(x) so that initial point is within 'x' vector

サインインしてコメントする。

その他の回答 (2 件)

Rik
Rik 2020 年 11 月 4 日
編集済み: Rik 2020 年 11 月 4 日
As far as I'm aware, this is not directly possible. If you rewrite the p-factors you can still use polyval.
y=p(1)*x+p(2)
x=(y-p(2))/p(1)=1/p(1)*y + -p(2)/p(1)
%so for numel(p)==2:
p_=[1 -p(2)]/p(1);
x=polyval(p_,y)
I haven't bothered to write a general inverter for p, but I suspect that isn't very hard.
Edit: I realised this is quite tricky for any order beyond 1, luckily you can empirically estimate the parameters:
%this requires a reasonable range of x:
p_=polyfit(polyval(p,x),x,numel(p)-1);

Steven Lord
Steven Lord 2020 年 11 月 4 日
For the simple case of a polynomial, you can use roots. For example if you want to find a value of x for which is equal to 50:
pOrig = [1 3 3 1];
p = pOrig; % Make a copy so we can use the original for checking later on
p(end) = p(end)-50;
r = roots(p);
check = polyval(pOrig, r) % Each element of check should be very close to 50
To check this graphically:
f = @(x) polyval(pOrig, x);
fplot(f); % Plot the polynomial
yline(50); % Draw the line y = 50
hold on
realroot = r(imag(r) == 0); % Find the real root for plotting
plot(realroot, f(realroot), 'o') % Indicate where the polynomial crosses the horizontal line
For a more general function you can use fzero as Ameer Hamza suggested.

カテゴリ

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