How to evaluate symbolic derivative?
4 views (last 30 days)
Show older comments
I have created a function, powerdiff, but when I try to evaluate it at a number I get the following error message. I am wanting to evaluate it at different points to try and find the root:
Subscript indices must either be real positive integers or logicals.
Error in sym/subsref (line 805)
R_tilde = builtin('subsref',L_tilde,Idx);
Error in ivcurve_var_zoom (line 36)
powerdiff(1e-2)
Here is my code. I can evaluate the original function, power, just not powerdiff (the derivative).
syms J
Veff=@(J)0;
%Creating voltage equation
for i=1:numbg
Jph=flux(i,2);%Constant
Avalue=A(i);%Constant
V=@(J)k*t*log((Jph-J)/Avalue)+bg(i);%Voltage function
Veff=@(J)Veff(J)+V(J);%Adds to previous voltage function
end
power=@(J)Veff(J).*J;
power(1e-2)
powerdiff=diff(power(J));
powerdiff(1e-2)
0 Comments
Accepted Answer
Stephan
on 10 Jul 2018
Edited: Stephan
on 10 Jul 2018
Hi,
you are treating the derivate like the function handle - but it is not a function handle.
What you do is asking matlab for the value of the vector powerdiff at the index 1e-2...
What you probably want to do is get the result of that function for the input value 1e-2.
Best regards
Stephan
8 Comments
Stephan
on 10 Jul 2018
Edited: Stephan
on 11 Jul 2018
Are these values possible candidats:
x01 =
0.006204896804547
x02 =
0.055984684725208
???
What did i do?:
% set J to symbolic variable
syms J
% Your function
f = log(J.*(-3.937007874015748e-4)+2.442872757695621e-6).*2.58519909e-2+log(J.*(-6.835083114610674e-3)+3.826599732420725e-4).*2.58519909e-2+J.*(1.017794917322835e-5./(J.*3.937007874015748e-4-2.442872757695621e-6)+1.767005064796588e-4./(J.*6.835083114610674e-3-3.826599732420725e-4))+3.1e1./1.0e1;
% divide in numerator and denominator
[num, den] = numden(f);
% set denominator equal to zero
f_asymp_vert = den == 0;
% solve this equation
x0 = solve(f_asymp_vert);
% set format
format long;
% extract the (still) symbolic values of the solution and convert to double
x01 = double(x0(1,1)) % --> 1831362293716070975/295147905179352825856
x02 = double(x0(2,1)) % --> 252132605266902219/4503599627370496000
--> Is that what you need?
Best regards
Stephan
More Answers (0)
See Also
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!