How to replace the sdpvar vector x with meshgrid variables to plot it? (YALMIP)

조회 수: 10 (최근 30일)
DB
DB 2022년 3월 30일
답변: Saarthak Gupta 2023년 12월 24일
I have polynomial f of min degree 2, max degree 6 with variables x1 and x2, which are defined in Matlab by:
x = sdpvar(2,1)
According to this comment, I set the following lines to prepare the polynomial for meshing in order to plot it:
f = f{1};
f = replace(f,'*','.*'); %replace to dot product
f = replace(f,'^','.^'); %replace to dot product
f = eval(['@(x)' f]) %function handle @(x,y)
[X1,X2] = meshgrid(-1:0.01:1,-1:0.01:1); %create meshgrid
f2 = f([X1;X2]); %define f2 as f with x(1)=X1 and x(2)=X2
mesh(X1,X2,f2); %plot f2 in X1 and X2
However I get an error because f2 becomes a scalar, instead of a matrix with all the possible solutions along X1 and X2. Therefore, I cannot plot it with mesh. I tried to follow the steps as given in this answer (link), but although both cases are with two variables, I cannot grasp it.

답변 (1개)

Saarthak Gupta
Saarthak Gupta 2023년 12월 24일
Hi,
Looks like you are trying to plot a “sdpvar” expression (YALMIP) over a given domain.
Your code does not correctly parametrize and convert the “sdpvar” expression to a function handle. Based on the given example, "p" represents a bi-variate polynomial in variables “x” and “y”, with a degree of 4. After completing the sum-of-squares decomposition and performing the required adjustments, the function handle is expected to accept two arguments – “x” and “y”. However, the error arises because you have provided only x as the input.
Refer to the following code:
sdpvar x y
[p,c] = polynomial([x y],4); % generate a parameterized polynomial
% solve sum-of-squares decomposition problem using constraints:
% 1. sum-of-squares constraint defined by sos(p)
% 2. p(pi,2) = 3
solvesos([sos(p), replace(p,[x y],[pi 2]) == 3],[],[],c);
% display evaluated polynomial in symbolic MATLAB form.
f = sdisplay(replace(p,c,value(c)));
f = f{1};
f = replace(f,'^','.^'); % element-wise exponentiation
f = replace(f,'*','.*'); % element-wise multiplication
f = str2func(['@(x,y)' f]); % convert function string to function handle
[X,Y] = meshgrid(-1:0.01:1,-1:0.01:1);
F = f(X,Y);
mesh(X,Y,F);
Also, it is not recommended to use “eval” for security and performance considerations. Consider using “str2func” instead.
Refer to the following MATLAB documentation for further reference:
Hope this helps!
Best regards,
Saarthak

카테고리

Help CenterFile Exchange에서 Symbolic Math Toolbox에 대해 자세히 알아보기

제품


릴리스

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by