Error using symengine in numerical solver

Hi guys
Im trying to calculate the Worst Case Expected returns according to Tüntücu and König (2004). In order to derive the robust weights, I need to solve an equation numerically. Below is the code for the calculation of the weights.
syms w_r
S = vpasolve(0==(1-((length(r_dc_s)^(-0.5))*(chi2inv(0.95,length(mu))))...
/(1*sqrt(w_r'*V*w_r)+((length(r_dc_s)^(-0.5))*(chi2inv(0.95,length(mu))))))...
*w1+w2-w_r,w_r);
w_r would be the robust weights in a vector of Nx1. When I run the code, I always get the following error message:
Error using symengine
Invalid operands.
Error in sym/privBinaryOp (line 1032)
Csym = mupadmex(op,args{1}.s, args{2}.s, varargin{:});
Error in / (line 375)
X = privBinaryOp(A, B, 'symobj::mrdivide');
If I understand the error message correctly, I would have to use element-wise multiplication or division. I do not see though where this would make sense. It can be seen that only the first line of the equation would result in a 1x1 double object, so would the second. The third line contains only Nx1 vectors (w1 and w2 are the speculative and minimal weights). The only place where I can imagine it could make sense to perform a element-wise multiplication would be .*w1+w2-w_r. This leads to the same error message though..
Do you guys can help me out with this? Would be highly appreciated!
Thanks in advance,
David

 Accepted Answer

syms w_r
S = vpasolve(0==(1-((length(r_dc_s)^(-0.5))*(chi2inv(0.95,length(mu))))...
/(1*sqrt(w_r'*V*w_r)+((length(r_dc_s)^(-0.5))*(chi2inv(0.95,length(mu))))))...
*w1+w2-w_r,w_r);
w_r would be the robust weights in a vector of Nx1
No, when you syms and give a name, the symbolic solver always treats it as referring to a scalar. With your expression being non-scalar, you would be asking vpasolve() to find the single w_r that solves all of the elements in the vector simultaneously. vpasolve() always treats the input as simultaneous equations, and never as an array of equations to solve individually.
In the case where the desired w_r do not interact with each other, the easiest approach is:
syms w_r
S = arrayfun(@(EXPR) vpasolve(EXPR, w_r), 0==(1-((length(r_dc_s)^(-0.5))*(chi2inv(0.95,length(mu))))...
/(1*sqrt(w_r'*V*w_r)+((length(r_dc_s)^(-0.5))*(chi2inv(0.95,length(mu))))))...
*w1+w2-w_r, 'uniform', 0);
The uniform, 0 option is there because I speculate that there might not be (findable) solutions for some of the values.
In the case where the w_r values do interact with each other, then you need to create a symbolic vector:
w_r = sym('w_r', N, 1);
followed by your existing vpasolve()

4 Comments

Thank you so much Walter, that worked perfectly! Need to dig a little deeper into the code to understand what you changed there, but you made my day.
Thanks again and all the best,
David
Which version worked for you?
The first option worked, the second option did not. After reading a bit about arrayfun, it is clear what I did wrong with my code at the start.
You might find that you do not need the 'uniform', 0 option. I put it in to cover the case where vpasolve() could not find a solution.

Sign in to comment.

More Answers (1)

Hi David,
The above issue is replicated by assuming that ‘V’ is also a NX1 vector. The issue can be solved by using ‘./’ instead of ‘/’ in the vpasolve expression.
Here is a similar question for your information.

4 Comments

Dear Devineni
Thank you for the answer.
I have tried that before as well, but it leads to another error which I understand even less.
Error using mupadengine/feval_internal (line 172)
More equations than variables is only supported for polynomial systems.
Error in sym/vpasolve (line 172)
sol = eng.feval_internal('symobj::vpasolve',eqns,vars,X0);
V is the covariance matrix of the returns, NxN matrix. As I see it, I only have one equation and one variable.
Any idea how to fix that?
Thanks, David
Hi David
In the question, it is observed that vpasolve equation is a N*N array by considering V as an N*N matrix. This can be noticed by running the below code in which expr is an N*N array. vpasolve supports more equations than variables only for polynomial systems. For nonpolynomial equations, there is no general method of finding all solutions and vpasolve returns only one solution by default as mentioned in the doc link.
syms w_r
expr = (1-((length(r_dc_s)^(-0.5))*(chi2inv(0.95,length(mu))))...
./(1*sqrt(w_r'*V*w_r)+((length(r_dc_s)^(-0.5))*(chi2inv(0.95,length(mu))))))...
.*w1+w2-w_r;
vpasolve() simply does not support having more equations than variables for non-polynomial systems. vpasolve() uses modified newton for nonlinear cases, and that method only works for square systems (same number of equations and variables.)
Thank you for your answers, really appreciate it. I understand the error message now, no idea though how to solve it. Seems like my approach won't work as I have hoped.
Anyways, thanks again and all the best,
David

Sign in to comment.

Categories

Community Treasure Hunt

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

Start Hunting!