MATLAB Optimizing Plotting for Complex Functions with Large Numbers

AI Thread Summary
The discussion revolves around issues with plotting a mathematical function using MATLAB's contour3 function, particularly when dealing with large parameter values. The user, Josh, notes that while the plot works well with normalized values (a = b = 1), it fails to produce a similar output with larger constants. Suggestions include normalizing the function and variables to improve control over the ranges and sampling, which could enhance the plot's quality. The conversation also touches on handling the origin, where the function approaches infinity, and the possibility of adjusting contour levels directly through the contour3 function's parameters. Overall, the focus is on improving the plot's accuracy and visual representation by modifying parameters and normalizing the function.
member 428835
Hi PF!

I am trying to run the following plot:

k = .001;
figure;
hold on
[X,Y]=meshgrid(-4:0.01:4);
a = 5.56*10^14;
b = .15/(2*.143*10^(-6));
for n = 1:8
k = k*2^(n-1);
Z = a./(X.^2+Y.^2).*exp(b.*(X-sqrt(X.^2+Y.^2)))-k;
contour3(X,Y,Z)
end

which works great if a = b = 1. But now when the numbers are big, I'm not getting a good plot. Any ideas how to remedy this?

Thanks so much!

Josh
 
Physics news on Phys.org
I think that there was a parameter to control the number of contour levels, somehow it was also possible to explicitly give the conour level values to be ploted. What do you mean by "not a good plot" ?
 
Sorry for the ambiguity. By "not a good plot" I mean the new plot looks nothing even remotely similar to the original. I know constants will change the graph, but not to this extent.

Are you suggesting I change the k values?
 
The values of a and b resamble some physical constants, you should normalize your function and reduce the number of constants involve. Normalize x and y in terms of a and normalize the function value in terms of k and a/b ratio. In this way you have a better control of the ranges of x, y and f(x,y). Otherwise rapidly changing regions may receive a poor samplig and will look not so good.
 
Ahhhh, good idea! So you saying let the function equal itself divided by a, right? and then let (X-sqrt(X.^2+Y.^2)) equal itself divided by b?
 
We introduce new variables ##x_1=x/\sqrt{b}## and ##y_1=y/\sqrt{b}## and the new function let's say ##f_1(x_1,y_1)## will read

f_1(x_1,y_1)=\frac{c}{x_1^2+y_1^2} \exp(x_1 -\sqrt{x_1^2 + y_1^2} )

with ##c=a/b##. We are left with only one constant in the function, ##c## beeing a scaling factor for the values of the function.
How do you handle the origin, i.e. ##(x,y)=(0,0)## ? The function ##f## goes to infinity!

On the other hand I think that you don't need to rest the ##k## value in order to obtain the contour level. The contour3() function receives a fourth parameter which alter the contour levels (step number, interval). You must read the MATLAB help to see whether any option may result useful in your case. I remember that several years ago I was forced to use Gnuplot insead of Mathlab because some specific plot options were not available.
 
  • Like
Likes member 428835
Thanks, this is very helpful! I really appreciate your time!
 
Back
Top