diff function rearranges symbolic expression leading to non-vanishing terms

6 views (last 30 days)
I am trying to feedback linearize my non-linear system in Matlab. To that end I have to represent it in the following form:
So after I have modeled my system in the form of nonlinear differential equations, , I use the diff function to take the derrivative with respect to u to aquire g, and . This works, of course only if the system can be represented in the mentioned form. However, the diff function rewrites some of my expressions, which then after subtraction lead to non-vanishing factors multiplying u. For example, my input is still present in multiplied with a factor 5.7024e-18. I suspect, there is some quantization error introduced due to diff re-writing the derivative . Can this be somehow avoided?
g_x=[diff(dxdt,[Q_g]) diff(dxdt,[Q_b])];
for i=1:size(g_x,1)
Here Q_g and Q_b are my inputs.
An example of the re-writing of expressions:
dxdt = - (1297036692682702848*Q_b*(C_carbv - 47/20000))/15694143981460705 + ..................
g_x=1905022642377719808/9808839988412940625 - (1297036692682702848*C_carbv)/15694143981460705
f_x=Q_b*((1297036692682702848*C_carbv)/15694143981460705 - 1905022642377719808/9808839988412940625) - (1297036692682702848*Q_b*(C_carbv - 47/20000))/15694143981460705 + ..............................
simplify(Q_b*((1297036692682702848*C_carbv)/15694143981460705 - 1905022642377719808/9808839988412940625) - ...
(1297036692682702848*Q_b*(C_carbv - 47/20000))/15694143981460705)
ans =
The .................. stands for terms that do not depend on Q_b.
Martin Elenkov
Martin Elenkov on 16 Jun 2021
Edited: Martin Elenkov on 16 Jun 2021
This is a script with the model parameters and equations. The cited expression are under index 9. So, dxdt(9), f_x(9), g_x(9,1:2). It is not simple, nor clean, but I think it is fairly clear what I am doing, asside from the complicated differential equations

Sign in to comment.

Accepted Answer

Paul on 16 Jun 2021
Why not just use collect() and coeffs() on the elements of dxdt? If the system is affine in u, then those should give the desired result directly
syms x u1 u2
dxdt = x^2 + x + x*u1 + x^3*u1 + x^2*u2 + u2;
dxdt = collect(dxdt,[u1 u2])
dxdt = 
[c,t] = coeffs(dxdt,[u1 u2])
c = 
t = 
fofx = c(find(t==1))
fofx = 
gofx = [c(find(t==u1)) c(find(t==u2))]
gofx = 
If the system is not affine in u, then extra terms will show up in t, so you can check numel(t) before doing any other processing to decide how to proceed.
dxdt = x^2 + x + x*u1 + x^3*u1 + x^2*u2 + u2 + u1*u2;
dxdt = collect(dxdt,[u1 u2])
dxdt = 
[c,t] = coeffs(dxdt,[u1 u2])
c = 
t = 
Martin Elenkov
Martin Elenkov on 17 Jun 2021
I also noticed that only the existing elements are returned, but it is an easy work around.

Sign in to comment.

More Answers (1)

John D'Errico
John D'Errico on 16 Jun 2021
This is a floating point problem, but it comes when MATLAB takes your constants and turns them into symbolic numbers. Do you see all of those large integers? For example...
X = sym(1.34536363425474)
X = 
But that ratio is not exactly the same value as the original number. It is typically a close approximation.
ans = 
So you get trash in there, down in digit 17 and below.
My question is, why is this a problem?
Martin Elenkov
Martin Elenkov on 16 Jun 2021
Edited: Martin Elenkov on 16 Jun 2021
Notice that in the first term Matlab factors only in front of the brackets, while in the second term, both the coefficient 83 and are factored out of the brackets (They both come from the same equation, Matlab just rewrites and rearranges them differently after some opperations - e.g. diff()).
ans =
0.19 is not 2.3e-3, but 83*2.3e-3 is aproximately equal to 0.19, depending on how you define your precision. It seems that Matlab reaproximates these coefficient after each (or at least some) opperations and that leads to this anoying problem.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!