How to Scale Gradient Field for large z-values?
4 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Niklas Kurz
le 29 Avr 2021
Commenté : Niklas Kurz
le 12 Mai 2024
I want to plot a function R^2 -> R with gradient Field beneath:
f2 = @(x,y) 1./sqrt(x.^2+y.^2);
[u2,v2] = meshgrid(-1:0.01:1);
[du2,dv2] = gradient(f2(u2,v2));
s = surf(u2,v2,f2(u2,v2));
hold on
contour(u2,v2,f2(u2,v2))
hold on
norm = 1./sqrt(du2.^2+dv2.^2);
quiver(u2,v2,du2./norm,dv2./norm,'LineWidth',2)
axis([-1 1 -1 1 0 10])
caxis([0,10])
colormap(cool)
alpha(s,0.95)
shading flat
Sadly the gradient field is not visible. Probably because it's too small, f2 get's too large and I'm lacking of the mathmatical knowledge to adjust it properly
0 commentaires
Réponse acceptée
Anurag Ojha
le 8 Mai 2024
Hello Niklas
One way to adjust it is by normalizing the gradient vectors before plotting them.
Here's an updated version of your code:
f2 = @(x,y) 1./sqrt(x.^2+y.^2);
[u2,v2] = meshgrid(-1:0.01:1);
[du2,dv2] = gradient(f2(u2,v2));
% Normalize the gradient vectors
norm = sqrt(du2.^2+dv2.^2);
du2_norm = du2./norm;
dv2_norm = dv2./norm;
s = surf(u2,v2,f2(u2,v2));
hold on
contour(u2,v2,f2(u2,v2))
hold on
quiver(u2,v2,du2_norm,dv2_norm,'LineWidth',2)
axis([-1 1 -1 1 0 10])
caxis([0,10])
colormap(cool)
alpha(s,0.95)
shading flat
This code normalizes the gradient vectors by dividing the du2 and dv2 components by their magnitude (norm). This ensures that the length of each vector is 1, making them visible in the plot.
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Surface and Mesh Plots 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!