Getting Both Symbolic Output and Numeric Output
1 view (last 30 days)
Show older comments
I would like to generate symbolic expressions representing the computations involved in a snippet of code (shown below), while simultaneously computing the actual numeric values used to solve the problem.
Let's say A is a 2x2 matrix, B is a 1x2 vector, Q is a 2x2 matrix, and R is a 1x1:
b = 100;
m = 1500;
A = [0 1; 0 -b/m];
B = [0 1/m]';
Q = 2*eye(length(A));
R = 2*eye(size(B,2));
I would like both the numeric solution for K, and the symoblic expressions representing the solution to K. For example,
K = [0 , -0.0125] and
K = [- A11*((B11*Q11)/(R11 + B11*(B11*Q11 + B21*Q21) + B21*(B11*Q12 + B21*Q22)) ...., - A12*((B11*Q11)/(R11 + B11*(B11*Q11 + B21*Q21) + B21*(B11*Q12 + B21*Q22)) ...]
function [ K ] = dlqr_finite( A, B, Q, R, N )
P = cell(1, N);
K = cell(1, N);
P{N+1} = Q;
% Solve backwards in time from N to 0
n = N+1;
while n > 1
P{n-1} = Q + (A.'*P{n}*A) - (A.'*P{n}*B)*(R+B.'*P{n}*B)^-1*(B.'*P{n}*A);
K{n-1} = -1*(R+B.'*P{n}*B)^-1*(B.'*P{n}*A);
n = n-1;
end
end
What is the easiest way to achieve these simultaneously?
0 Comments
Accepted Answer
Karan Gill
on 21 Nov 2016
Calculate the answer symbolically and substitute values in at the end.
Start with symbolic matrices and variables ...
syms b m
A = sym('A%d%d',[2 2])
B = sym('B%d%d',[2 1])
Q = sym('Q%d%d',[2 2])
syms R
Find K. Then define your numeric values.
bVal = 100;
mVal = 1500;
Aval = [0 1; 0 -bVal/mVal]
...
Now substitute to get your numeric answer.
KVal = subs(K,A,Aval);
KVal = subs(K,B,Bval);
...
Finally, use 'vpa' or 'double' to convert to floating point.
2 Comments
Karan Gill
on 22 Nov 2016
Happy to help! In general the workflow is to stay symbolic as far as possible and then substitute in numeric values when it becomes necessary. It's hard to communicate this well in the doc without making every example about 'subs'.
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!