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

6 Ansichten (letzte 30 Tage)
Angelavtc
Angelavtc am 4 Nov. 2020
Kommentiert: Ameer Hamza am 6 Nov. 2020
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!

Akzeptierte Antwort

Ameer Hamza
Ameer Hamza am 4 Nov. 2020
Bearbeitet: Ameer Hamza am 4 Nov. 2020
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 Kommentare
Angelavtc
Angelavtc am 5 Nov. 2020
Bearbeitet: Angelavtc am 5 Nov. 2020
@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 am 6 Nov. 2020
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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Rik
Rik am 4 Nov. 2020
Bearbeitet: Rik am 4 Nov. 2020
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 am 4 Nov. 2020
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.

Kategorien

Mehr zu Polynomials finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by