Plotting variables from an implicit function

16 vues (au cours des 30 derniers jours)
Shyam
Shyam le 14 Août 2023
Modifié(e) : Ruchika le 14 Août 2023
d=0.2; fs=250e3; Vo=40; C=126e-12; V=425; I=75;
A1=Vo/Vdc; A2=2*fs*Io/Vdc; A3=Cp*(Vdc/Io)^2;
f = dmin - A1/n - A2*n*L*( 1+sqrt( 1-A3/(n*L) ) );
fimplicit(f,[0.1e-6 50e-6 0.01 0.5])
Warning: Function behaves unexpectedly on array inputs. To improve performance, properly vectorize your function to return an output with the same size and shape as the input arguments.
I am getting a blank plot after executing the above statements. Kindly let me know where I am going wrong.
Thank you.

Réponse acceptée

John D'Errico
John D'Errico le 14 Août 2023
fimplicit plots the lines where your function is ZERO in that region. Is it ever zero? Probably not.
dmin=0.2; fs=250e3; Vo=40; Coss=126e-12; Vdc=425; Io=75;
Cp=2*Coss;
A1=Vo/Vdc; A2=2*fs*Io/Vdc; A3=Cp*(Vdc/Io)^2;
First, fix your function so it is properly vectorized. Note my use of the dotted operators. You don't need them for scalar multiplication.
f = @(L,n) dmin - A1./n - A2*n.*L.*(1+sqrt(1-A3./(n.*L)));
Look at a sample value of your function in that interval. This also lets me verify if the function evaluates properly.
f(1e-5,.1)
ans = -0.9173
fimplicit(f,[0.1e-6 50e-6 0.01 0.5])
Again, the blank plot suggests there are no places in that region where the function crosses zero. At least, no place that was found by fimplicit. Be very careful however, since your intervals cover many powers of 10. So something might happen near zero, and fimplicit missed it.
We can take a look at the surface, to see what may be happening.
fsurf(f,[0.1e-6 50e-6 0.01 0.5])
And that suggests it comes close to zero in one corner of the domain, near [0,.5]. So if I change the limits just a bit, we might find a solution.
fimplicit(f,[0.1e-7 1e-6 0.4 0.6])
grid on
And indeed we did, but we had to look a bit outside of your original domain.

Plus de réponses (2)

Steven Lord
Steven Lord le 14 Août 2023
Let's vectorize your function and see what it looks like when you plot it as a surface.
dmin=0.2; fs=250e3; Vo=40; Coss=126e-12; Vdc=425; Io=75;
Cp=2*Coss;
A1=Vo/Vdc; A2=2*fs*Io/Vdc; A3=Cp*(Vdc/Io)^2;
I changed your code to use element-wise multiplication and division rather than matrix multiplication and division. See this documentation page for more information.
f = @(L,n) dmin - A1./n - A2*n.*L.*( 1+sqrt( 1-A3./(n.*L) ) );
fsurf(f,[0.1e-6 50e-6 0.01 0.5])
What does fimplicit do? From the fimplicit documentation: "fimplicit(f) plots the implicit function defined by f(x,y) = 0 over the default interval [-5 5] for x and y." Based on this surface, I'd say that call should plot at most a handful of points and that's only if the upper-left corner of the plot actually reaches the zero plane. Does it?
f(0.1e-6, 0.5)
ans = 0.0033
Yes, barely. And if you look very carefully at that corner of your fimplicit plot you'll see just a hint of a blue line. So fimplicit behaved correctly.

Ruchika
Ruchika le 14 Août 2023
Modifié(e) : Ruchika le 14 Août 2023
Hi, based on my understanding, you want to plot the equation using 'fimplicit' but this function aims to plot implicit functions and the nature of your equation might not be suitable for this approach. It seems that your equation involves both square roots and divisions, which can complicate the process of plotting it directly using 'fimplicit'.
In the following code, I've created a meshgrid of L and n values and evaluated the equation over that grid to obtain the z values. The 'surf' plot essentially visualizes the variation of the equation's value in a 3D space. Please feel free to adjust the range and number of points in the linspace calls according to your needs.
dmin = 0.2;
fs = 250e3;
Vo = 40;
Coss = 126e-12;
Vdc = 425;
Io = 75;
Cp = 2 * Coss;
A1 = Vo / Vdc;
A2 = 2 * fs * Io / Vdc;
A3 = Cp * (Vdc / Io)^2;
% Define the equation
f = @(L, n) dmin - A1 ./ n - A2 .* n .* L .* (1 + sqrt(1 - A3 ./ (n .* L)));
% Define the range of values for L and n
L_range = linspace(1e-6, 50e-6, 100); % Adjust the range and number of points
n_range = linspace(0.01, 0.5, 100); % Adjust the range and number of points
% Create a meshgrid of L and n values
[L, n] = meshgrid(L_range, n_range);
% Evaluate the equation over the meshgrid
z = f(L, n);
% Plot the equation
figure;
surf(L, n, z);
xlabel('L');
ylabel('n');
zlabel('Equation Value');
title('Plot of the Equation');
grid on;
To learn more about the above functions, please check out the MathWorks documentation links below:

Catégories

En savoir plus sur Mathematics dans Help Center et File Exchange

Produits


Version

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by