Surface plot for two variable piecewise function

I need help plotting the following piecewise function in Matlab as surface plot. Any help is appreciated!!
x1 and x2 are [0,1]

3 Comments

Are x1, x2 assumed to be >= 0 ?
x1 and x2 are from 0 to 1.
Then you can follow @Dyuman Joshi 's hints.

Sign in to comment.

Answers (1)

Utilize meshgrid to generate the points and evaluate the function using the points.
Then employ surf to plot the piecewise function.

9 Comments

I used the following code:
Can someone verify this is correct?
clc;
clear
U = @(x1,x2) (1-exp(-5*(x1.^3+x2.^2).^1/3)) .* (((x1.^3 + x2.^2) >= 0) & ((x1.^3 + x2.^2) <= 1)) + (x1.^3 + x2.^2 - 1) .* (((x1.^3 + x2.^2) >= 1) & ((x1.^3 + x2.^2) <= 2));
x = linspace(-1, 3);
y = linspace(-1, 3);
[X,Y] = ndgrid(x,y);
figure
fsurf(U, [ -2 3 -2 3], 'MeshDensity',75)
Why do you plot for -2 <= x1, x2 <= 3 if 0 <= x1, x2 <= 1 as you stated above?
And this part of your code seems superfluous:
x = linspace(-1, 3);
y = linspace(-1, 3);
[X,Y] = ndgrid(x,y);
Yeah I just fixed that.
There is a clear discontinuity when I plot though. How can I tell by how much I must adjust the equations to fix that?
clc;
clear
U = @(x1,x2) (1-exp(-5*(x1.^3+x2.^2).^1/3)) .* (((x1.^3 + x2.^2) >= 0) & ((x1.^3 + x2.^2) <= 1)) + (x1.^3 + x2.^2 - 1) .* (((x1.^3 + x2.^2) >= 1) & ((x1.^3 + x2.^2) <= 2));
x = linspace(-1, 3);
y = linspace(-1, 3);
[X,Y] = ndgrid(x,y);
figure
fsurf(U, [ -0 1 -0 1], 'MeshDensity',75)
You don't need to generate the grid of points with fsurf.
There is a discontinuity because that's how the function works.
U = @(x1,x2) (1-exp(-5*(x1.^3+x2.^2).^1/3)) .* (((x1.^3 + x2.^2) >= 0) & ((x1.^3 + x2.^2) <= 1)) + (x1.^3 + x2.^2 - 1) .* (((x1.^3 + x2.^2) >= 1) & ((x1.^3 + x2.^2) <= 2));
%The domain of x1 and x2 is [0 1]
fsurf(U, [0 1 0 1], 'MeshDensity', 75)
view([45 45])
There is a clear discontinuity when I plot though. How can I tell by how much I must adjust the equations to fix that?
Compute the values for your two function definitions for x1^3+x2^2 = 1 and make these values equal by adding appropriate values to your two functions. There is not a single solution, but many ways to do so. But I don't know what function manipulations are allowed in your case.
I did:
U(1,0) = U(1,0)
0=1-e^-5
I then subtracted that 1-e^(-5) from the first equation:
clc;
clear
U = @(x1,x2) (1-exp(-5*(x1.^3+x2.^2).^1/3)-(1-exp(-5))) .* (((x1.^3 + x2.^2) >= 0) & ((x1.^3 + x2.^2) <= 1)) + (x1.^3 + x2.^2 - 1) .* (((x1.^3 + x2.^2) >= 1) & ((x1.^3 + x2.^2) <= 2));
figure
fsurf(U, [ 0 1 0 1], 'MeshDensity',75)
A bracket around 1/3 was missing. Should be
U = @(x1,x2) (1-exp(-5*(x1.^3+x2.^2).^(1/3))-(1-exp(-5))) .* (((x1.^3 + x2.^2) >= 0) & ((x1.^3 + x2.^2) <= 1)) + (x1.^3 + x2.^2 - 1) .* (((x1.^3 + x2.^2) >= 1) & ((x1.^3 + x2.^2) <= 2));
figure
fsurf(U, [ 0 1 0 1], 'MeshDensity',75)
"A bracket around 1/3 was missing."
Ah, that should be it.

Sign in to comment.

Asked:

on 21 Oct 2023

Commented:

on 21 Oct 2023

Community Treasure Hunt

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

Start Hunting!