How to get real root of a function using fminbnd?
4 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
rezheen
el 30 de Abr. de 2025
Comentada: rezheen
el 1 de Mayo de 2025
Hello, How can I force MATLAB to only give real solutions to a math function using fminbnd?
This is my code:
x=-1:0.01:8; y=@(x) (x).^(4/3); yinv=@(x) -((x).^(4/3)); x_1=-1; x_2=8;
[xmin, ymin]=fminbnd(y,x_1,x_2);
[xmax, ymax]=fminbnd(yinv,x_1,x_2);
fprintf('The local maximum is %.2f at x = %.2f\n', -ymax, xmax)
fprintf('The local minimum is %.2f at x = %.2f\n', ymin, xmin)
Gives this as output:
The local maximum is 16.00 at x = 8.00 % Good. This is what it's supposed to be based on the x domain
The local minimum is -0.50 at x = -1.00 % This is the problem. (-1)^(4/3)=1 (The real solution)
Also, when I test in the Command Window:
(-1)^(4/3)
I get
-0.5000-0.866i
I think my code is spitting out the real part of (-1)^(4/3) that I get in Command Window.
Thanks for your help
1 comentario
John D'Errico
el 30 de Abr. de 2025
Movida: John D'Errico
el 30 de Abr. de 2025
I think you are confused. FMINBND is a MINIMIZER. It does not compute a root. If the minimum of your objective can be negative, you will get it.
You want to use fzero to compute a root. Even at that, you need to understand that raising a negative number to a fractional power has a complex result as the primary solution.
Respuesta aceptada
John D'Errico
el 30 de Abr. de 2025
Editada: John D'Errico
el 30 de Abr. de 2025
It sounds like you want to see the result:
(-1)^(4/3) == 1
To do that, you want to use nthroot, by splitting the fraction in that exponent into two parts.
x^(4/3) = (x^(1/3))^4
And therefore, we would have
f = @(x) nthroot(x,3)^4;
f(-1)
So now a nice real number.
This works as long as the denominator of the exponent is an integer, and thus we can use nthroot. Will it still work, if we tried that trick on x^0.63? Well, in theory, it migh seem so, since 0.63 = 63/100. But nthroot will fail then. Try it:
nthroot(-2,100)^63
Más respuestas (1)
Walter Roberson
el 30 de Abr. de 2025
x=-1:0.01:8; y=@(x) (x).^(4/3); yinv=@(x) -((x).^(4/3)); x_1=-1; x_2=8;
[xmin, ymin]=fminbnd(y,x_1,x_2);
[xmax, ymax]=fminbnd(yinv,x_1,x_2);
fprintf('The local maximum is %.2f at x = %.2f\n', -ymax, xmax)
fprintf('The local minimum is %.2f+%.2fi at x = %.2f\n', real(ymin), imag(ymin), xmin)
fprintf() ignores the imaginary component of numbers.
Ver también
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!