# I want to plot between "W" and "lambda" for different values of "psi" but don't know what's going wrong.

2 views (last 30 days)
AVINASH SAHU on 8 Jul 2022
Commented: Torsten on 9 Jul 2022
syms x lambda
warning off
alpha = -0.1;
sigma = 0.1;
eps = -0.1;
e = 0.2;
M = 10;
a = 2;
figure
psi_list = [10, 20, 30, 40. 50];
for i = 1:numel(psi_list)
psi = psi_list(i);
hbar = @(x) a - a.*x + x;
A1 = eps + alpha^3 + (3 * sigma^2 * alpha);
B1 = @(x,lambda) (-3 * lambda * M) * ((hbar(x).^2) + (2 .* hbar(x) .* alpha) + (sigma^2) + (alpha^2));
a1 = @(x) tanh(M .* hbar(x));
b1 = @(x) 1 - ((tanh(M .* hbar(x))).^2);
c1 = (M * alpha) - ((M^3 * A1)/3);
d1 = @(lambda) 2 * (M^2) * (1 + lambda);
C1 = @(x) a1(x) + (b1(x) .* c1);
D1 = @(x,lambda) d1(lambda) .* ((hbar(x).^3) + (3 .* (hbar(x).^2) .* alpha) + (3 .* hbar(x) .* (alpha)^2) + (3 .* hbar(x) .* (sigma)^2) + eps + (3 * alpha * (sigma^2)) + (alpha^3));
f1 = @(x,lambda) B1(x,lambda) + (3 * lambda .* C1(x) .* hbar(x)) + (3 * lambda .* C1(x) .* alpha) + (D1(x,lambda) .* C1(x));
f2 = @(x,lambda) 12 * (M^2) * (1 + lambda) .* C1(x);
f3 = psi * (e^3);
f4 = @(lambda) (1 + lambda) *180 * ((1 - e)^2); % 180 is not given in paper
f5 = @(lambda) 1/(2 + lambda);
F = @(x,lambda) ((f5(lambda) .* f1(x,lambda))./f2(x,lambda)) + (f3/f4(lambda));
q1 = @(x,lambda) hbar(x) ./ (2 .* F(x,lambda));
Q1 = @(lambda) integral(q1,0,1); % integration with respect to "x" limit 0 to 1
q2 = @(x,lambda) 1./(F(x,lambda));
Q2 = @(lambda) integral(q2,0,1); % integration with respect to "x" limit 0 to 1
Q = @(lambda) Q1(lambda)/Q2(lambda); % Q is a function of "lambda"
p1 = @(x,lambda) (1./F(x,lambda)) .* ((0.5 .* hbar(x)) - Q(lambda));
P = @(x,lambda) integral(p1,0,x); % integration with respect to "x" limit 0 to x
% W is obtained by integrating "P" with respect to x limit of x is 0 to 1
W =@(lambda) integral(P,0,1);
fplot(W(lambda), [0 1])
end
Error using integral
Limits of integration must be double or single scalars.

Error in solution (line 43)
P = @(x,lambda) integral(p1,0,x); % integration with respect ot "x" limit 0 to x

Error in integralCalc/iterateScalarValued (line 314)
fx = FUN(t);

Error in integralCalc/vadapt (line 132)
[q,errbnd] = iterateScalarValued(u,tinterval,pathlen);

Error in integralCalc (line 75)

Error in integral (line 87)
Q = integralCalc(fun,a,b,opstruct);

Error in solution (line 46)
W =@(lambda) integral(P,0,1);
legend(num2str(psi_list'))
ylim([0 1])
set(gca, 'ytick', 0:0.1:1);
set(gca, 'xtick', 0:0.2:1);
xlabel('x')
ylabel('W(lambda)')

patrick1704 on 9 Jul 2022
Well, what's going wrong in this context is that your "W" calls "P", which wants to evaluate from [0,x] with x being defined as a symbolic variable. This is not possible with integral but only int (Definite and indefinite integrals - MATLAB int - MathWorks Deutschland).
However, I think that your recursive function definition is anyway a little off. From my perspective, you defined all functions with the anyonymouse handle @(lambda, x), with lambda being defined by fplot and x being either numeric or symbolic depending on what you want/need to achieve. Additionally, you have to explicity call the inputs to pass them to the next function.
##### 1 CommentShowHide None
Torsten on 9 Jul 2022