plot piecewise 3d function

조회 수: 12 (최근 30일)
Rebecca Müller
Rebecca Müller 2018년 7월 19일
댓글: Rebecca Müller 2018년 7월 19일
Hey, my code is
if
clear
hbar = 6.582119e-01; % Planck constant (meV ps)
clf reset;
Delta = 1.0;
tau = 0.5;
o = 3./hbar;
A = 1;
[omega,d] = meshgrid(0:0.25:7,0:0.25:7);
syms k(omega) l_1(omega) l_2(omega)
k_0 = (omega-2.*Delta)./(omega+2.*Delta);
k(omega) = piecewise(2.*Delta<= omega, k_0, 0); % the 0 is just random to stay inside the definition interval of the elliptic functions; later I cut them off by the heaviside function
l_1_0 = (o-omega-2.*Delta)./(-omega+o+2.*Delta);
l_1(omega) = piecewise(o-2.*Delta<= omega, l_1_0, 0);
l_2_0 = (omega-o-2.*Delta)./(omega-o+2.*Delta);
l_2(omega) = piecewise(o+2.*Delta<= omega, l_2_0, 0);
[K,E] = ellipke(k(omega));
[L_1,F_1] = ellipke(l_1(omega));
[L_2,F_2] = ellipke(l_2(omega));
Resi_0 = pi./8.*((1+2.*Delta./omega).*E-(4.*Delta./omega).*K).*heaviside(omega-2.*Delta);
Resi_l_1 = -2.*pi./8.*A.*(((1+2.*Delta./(o-omega)).*L_1-(4.*Delta./(o-omega).*F_1).*heaviside(o-omega-2.*Delta)).*sin(o.*d));
Resi_l_2 = 2.*pi./8.*A.*(((1+2.*Delta./(omega-o).*L_2-4.*Delta./(omega-o).*F_2).*heaviside(omega-o-2.*Delta)).*sin(o.*d));
Resigma = Resi_0 + Resi_l_1 + Resi_l_2;
plot3(d,omega,Resigma); % I tried plot3 and fplot3, both with the same error
hold on
view(-35,45)
axis([-.5 10.5 -.5 10.5 0 1.5])
hold off
end
I really don't understand why matlab doesn't want to do what I want it to do...the error I get is:
if true
Error using plot3
Data must be numeric, datetime, duration or an array convertible to double.
Error in gamma (line 30)
plot3(d,omega,Resigma);
end
I would really appreciate any kind of help...

채택된 답변

Jason Whitfield
Jason Whitfield 2018년 7월 19일
편집: Jason Whitfield 2018년 7월 19일
In your code, the following line will overwrite your "omega" variable with a symbolic variable.
syms k(omega) l_1(omega) l_2(omega)
You can fix this issue by replacing the "omega" variable in your symbolic functions with some unused name.
  댓글 수: 3
Jason Whitfield
Jason Whitfield 2018년 7월 19일
Your symbolic functions still need to have a parameter, it just can't be called "omega." You could call it "x" instead. Then, the first function would look something like this:
syms k(x) l_1(x) l_2(x)
k_0 = (x-2.*Delta)./(x+2.*Delta);
k(x) = piecewise(2.*Delta<= x, k_0, 0);
[K,E] = ellipke(k(omega));
Rebecca Müller
Rebecca Müller 2018년 7월 19일
with the replacement you suggested before editing your first answer:
if
k_0 = (omega-2.*Delta)./(omega+2.*Delta );
k(omega) = piecewise(2.*Delta<= omega, k_0, 0 );
[K,E] = ellipke(k(omega));
Would become this:
k = (omega-2.*Delta)./(omega+2.*Delta ); k(2.*Delta > omega) = 0 ; [K,E] = ellipke(k); end it worked!!! Thank you very much!!

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Assumptions에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by