Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

How to Plot contours of function

Posted on 2013-06-27
20
Medium Priority
?
959 Views
Last Modified: 2013-07-08
Hi, Does anyone know how i can plot contour of this function?

Here is what i tried but it did not work.

x = -50 + 100.*rand(50,2);

function f = func(x)
D = 2;
[ps, D] = size(x);
o=-50+100*rand(1,D);
x=x-repmat(o,ps,1);
f = max(abs(x), [], 2);
end

This is how i tried doing it:

cmin = -50;
cmax =  50;
steps = 20;
c = linspace(cmin, cmax, steps); % Create the mesh
[X1, X2] = meshgrid(c, c)
contour(X1,X2,f);

Open in new window


Any idea how i could solve this.  Does any one know how to plot contour of functions which takes in one value like the above. Any time i try to plot the above function, it tells me that z must be atleast a 2x2. But i am taking in only one input and giving out a vector, how can it give out a matrix of atleast 2x2 inorder to plot the contour?
0
Comment
Question by:wish_C
  • 12
  • 7
19 Comments
 

Author Comment

by:wish_C
ID: 39283830
Anybody have an idea on this please?
0
 
LVL 27

Expert Comment

by:d-glitch
ID: 39284354
A contour plot typically shows lines of equal value over a two dimension area.
Elevation above sea level as a function of longitude and latitude is one example.

What is your two dimensional map?
What are the units of your equal value lines?

Contours are usually associated with continuous functions?  
What is the rand() function for?

At a more basic level, what are you hoping to accomplish?
0
 

Author Comment

by:wish_C
ID: 39284463
Thanks d-glitch. Basically i have a function name func in my code above. I generate a random number 50 x 2 matrix using rand() from here: So the rand() is to generate some random values.
x = -50 + 100.*rand(50,2);

Open in new window

This random matrix is going to be passed to the function func like this:
eva = func(x)

Open in new window

The function returns an array for vectors which are 50 x 1. I try to plot contour of the resulting eva by doing This: My 2 dimensional map is This [X1, X2] = meshgrid(c, c) as it is shown here:
cmin = -50;
cmax =  50;
steps = 20;
c = linspace(cmin, cmax, steps); % Create the mesh
[X1, X2] = meshgrid(c, c)
contour(X1,X2,eva);

Open in new window

The unite of my equal value line is:
steps = 20;

Open in new window

But any time i run this, it tell me that eva, has to be a matrix of atleast 2x2. As it is now it just give a matrix of 50 x 1. I need eva to be atleast 2x2 matrix so that i can plot the contour. I am now seeking for advice how to do this. Is there a way i can plot the contour? Any suggestion?
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 27

Expert Comment

by:d-glitch
ID: 39284871
If you know the elevations at the corners of section of a map, you may be able to map the contour lines inside that section.

If you want to draw contours at 10 foot intervals, you interpolate along the edges to find all the interval values and then connect the points.

I have attached an example for a simple 2x2 matrix that represents one small map element.

I don't know what contours on a 1-D array could possibly mean.
Could you make a drawing showing the sort of plot you would like to see?
Contour-Plot-for-ExEx.pdf
0
 

Author Comment

by:wish_C
ID: 39284983
Attached is what i am trying to achieve.  I am trying to come up with a 3-D map for a 2-D function as shown in the attachment. The eva is supposed to be the third dimension which according to contour plot should be atleast a 2x2 matrix. My problem is eva is a 50x1.
SampleSchwefel.jpg
0
 
LVL 27

Expert Comment

by:d-glitch
ID: 39285145
In your example, the data file is probably a 2D matrix with dimensions of 21x21.  It could have finer or coarser resolution.

But at 21x21, there would be 441 data values representing the z-axis value/height of the function at
  x = -100, -9-, -80, ...0, 10, 20, ... 100    and    y = -100, -9-, -80, ...0, 10, 20, ... 100

In your example, the contour plot is the flat 2D plot at z=-460, not the colorful squarish cone that rises over it.

There are no random variables in your example.

Your first step should probably be to make a 2D matrix that samples your function at discrete points.  Once you have a function, you can think about ways to plot it.

And I still don't know what you are trying to do or why you are trying to do it.
Are you really trying to do something with Genetic Algorithms and the Schwefel function?
0
 

Author Comment

by:wish_C
ID: 39285190
Here is my attempt
M = 50;   
n = 2;
x = -50 + 100.*rand(M,n);

cmin = -M;
cmax =  M;
ngrid = 5.05;
x = cmin:ngrid:cmax;
y = cmin:ngrid:cmax;

o     = -50+100*rand(1,n);
y     = y - repmat(o,1,10);
x     = x - repmat(o,1,10);

f = arrayfun(@tteee1,x);

figure;
contour(x,y,f);

figure;
surfc(x, y,f);
title(sprintf('The Surface and contour Plot'))

Open in new window

:

The tteee1 function is here:
function fit = tteee1(x)
D = 2;
[ps, D] = size(x);
o=-50+100*rand(1,D);
x=x-repmat(o,ps,1);
fit = max(abs(x), [], 2);
end

Open in new window


when i run the program, it gives me this error:
??? Error using ==> contour at 73
Z must be size 2x2 or greater.

Error in ==> tteee at 20
contour(x,y,f);
0
 
LVL 27

Expert Comment

by:d-glitch
ID: 39285360
Look at your Workspace in the top left window.  
What are the dimensions of your arrays?

Try this:    

data = 20*rand([10,10])
figure;
contour(data);

Open in new window

0
 

Author Comment

by:wish_C
ID: 39285411
My x and y array each have 1x20 dimension. and f is also 1x20. I need a strategy that cam make f 2x2 or more. say 20x20. In this way i can plot the contour just like the example you as me to try. I am trying to plot contour of function tteee1 above.
0
 

Author Comment

by:wish_C
ID: 39285453
Here is what i have done so far:

cmin = -M;
cmax =  M;
steps = 20;
c = linspace(cmin, cmax, steps); % Create the mesh
[x, y] = meshgrid(c, c); % Create the grid
o=-50+100*rand(1,n);
c = c - repmat(o,1,10);


f = arrayfun(@tteee1,x);

figure,
contour(x,y,f);

figure,
surfc(x, y,f);

Open in new window


This give a results as attached which looks different from the one i attached earlier which i am trying to achieve.

Do you know why they look different? Am trying to plot contour and contour surface of This function:
function f= tteee1(x)
D = 2;
[ps, D] = size(x);
o=-50+100*rand(1,D);
x=x-repmat(o,ps,1);
f = max(abs(x), [], 2);
end

Open in new window


I am not sure if arrayfun are appropriate for this task. If there are other appropriate method to achieve my goal, they are welcome.
PlotResult.pdf
0
 
LVL 27

Expert Comment

by:d-glitch
ID: 39285666
Try calculating your data matrix using nested for loops:
for x = 1:20
    for y = 1:20
        hilbert(x, y) = 1/(x+y -1);
    end
end

Open in new window

This is an example from the Matlab documentation.
0
 

Author Comment

by:wish_C
ID: 39285754
I actually tried the nested for loops but had the same problem. See the code maybe you will spot what i was doing wrong:

cmin = -M;
cmax =  M;
steps = 20;
c = linspace(cmin, cmax, steps); % Create the mesh
[x, y] = meshgrid(c, c); % Create the grid
%o=-50+100*rand(1,n);
%c = c - repmat(o,1,10);

for I=1:length(x)
    for J=1:length(y)
    o=-50+100*rand(1,2);
    x=x-repmat(o,20,10);
    f = max(abs(x), [], 2); 
    end
end

figure,
contour(x,y,f);

figure,
surfc(x, y,f);
                                            

Open in new window


This still gives me the error:
Z must be size 2x2 or greater

The example you give involves x and y, which will surely work in a for loop, but in my case i only have one input which is x. How can it have the function f to output atleast a 2x2 matrix when only one input is given?
0
 

Author Comment

by:wish_C
ID: 39286082
Are you really trying to do something with Genetic Algorithms and the Schwefel function?
Yes, i am actually try to implement Estimation of Distribution Algorithm (EDA) in Evolutionary Computation to understand it. I am trying to test it on Benchmark functions in 2d and i am having trouble with plotting contour of some of them, and Schwefel function is one of them.
0
 

Author Comment

by:wish_C
ID: 39287043
I have fix the error. Thanks you all.
0
 

Author Comment

by:wish_C
ID: 39290084
I've requested that this question be closed as follows:

Accepted answer: 0 points for wish_C's comment #a39287043

for the following reason:

I solve it myself.
0
 
LVL 27

Expert Comment

by:d-glitch
ID: 39290077
...
0
 
LVL 27

Expert Comment

by:d-glitch
ID: 39290085
Please post your solution.  It should be part of the closed question.
0
 

Accepted Solution

by:
wish_C earned 0 total points
ID: 39297378
Here is the code that worked for me.

SWxlimits = [-100 100];
SWbias = [20 -20];
SWdx = (SWxlimits(2) - SWxlimits(1)) / 100;
SWN = floor((SWxlimits(2) - SWxlimits(1)) / SWdx) + 1;
Schwefel221objShifted = zeros(SWN, SWN);

SWi = 0;
for SWx = SWxlimits(1) : SWdx : SWxlimits(2)
    SWi = SWi + 1;
    SWk = 0;
    for SWy = SWxlimits(1) : SWdx : SWxlimits(2)
        SWk = SWk + 1;
        Schwefel221objShifted(SWi,SWk) = max(abs(SWx-SWbias(1)), abs(SWy-SWbias(2))); 
    end
end
[SWx, SWy] = meshgrid(SWxlimits(1) : SWdx : SWxlimits(2));

figure;
contour(SWx,SWy,Schwefel221objShifted);
figure;
figure;
surfc(SWx,SWy,Schwefel221objShifted);

Open in new window

0
 

Author Closing Comment

by:wish_C
ID: 39306601
My code is now giving the right output as expected.
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction This article discusses the Chain of Responsibility pattern, explaining What it is;Why it is; andHow it is At the end of this article, I hope you will be able to describe the use and benefits of Chain of Responsibility.  Backgrou…
When there is a disconnect between the intentions of their creator and the recipient, when algorithms go awry, they can have disastrous consequences.
This is a video describing the growing solar energy use in Utah. This is a topic that greatly interests me and so I decided to produce a video about it.
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…
Suggested Courses

824 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question