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

16 vues (au cours des 30 derniers jours)
Angelavtc
Angelavtc le 4 Nov 2020
Commenté : Ameer Hamza le 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!

Réponse acceptée

Ameer Hamza
Ameer Hamza le 4 Nov 2020
Modifié(e) : Ameer Hamza le 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 commentaires
Angelavtc
Angelavtc le 5 Nov 2020
Modifié(e) : Angelavtc le 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 le 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

Connectez-vous pour commenter.

Plus de réponses (2)

Rik
Rik le 4 Nov 2020
Modifié(e) : Rik le 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 le 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.

Catégories

En savoir plus sur Polynomials dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by