3 views (last 30 days)

Hi all,

Replicating the cardiac nodal cell model (set of ODEs) from MATLAB (2018a, 64bit) to Simulink I found different results in solution of a particulal equation (without derivatives). Later, I also found the same difference in Matlab results either by changing the order of mathematical operations (e.g. (x./y).*z ~= x.*z./y), or calculating parts of the equation separately first, and then combining them. Example of the latter case is below (see also attached file). The problem appears in equation in the line 451. Temporal variables al57 and al571 show different results, though the difference is not too big. For the first time step, 1.1324 and 1.0209, respectively, and the second value seems correct being checked with calculator, with the same (2nd) result in Simulink.

A(:,57) = 1.0+ (S(:,6)./C(:,19)).*(1.0+exp(( - C(:,16).*S(:,1))./C(:,49))+C(:,14)./C(:,23))+ C(:,14)./C(:,20)+power(C(:,14), 2.0)./ (C(:,20).*C(:,21))+power(C(:,14), 3.0)./( C(:,20).*C(:,21).*C(:,22));

al57 = A(:,57)

al570 = (1.0+exp(( - C(:,16).*S(:,1))./C(:,49))+C(:,14)./C(:,23))+C(:,14)./C(:,20)+power(C(:,14), 2.0)./ (C(:,20).*C(:,21))+ power(C(:,14), 3.0)./( C(:,20).*C(:,21).*C(:,22));

al571 = 1.0+ (S(:,6)./C(:,19)).*al570

-----

al57 =

1.1324

al571 =

1.0209

Can anyone comment or give some advice? Thanks in advance.

James Tursa
on 6 Jan 2020

Edited: James Tursa
on 6 Jan 2020

You haven't broken up the calculations properly. I.e., you are comparing different calculations. Your code is essentially:

A(:,57) = 1.0+ (S(:,6)./C(:,19)).*(1.0+exp(( - C(:,16).*S(:,1))./C(:,49))+C(:,14)./C(:,23))+ C(:,14)./C(:,20)+power(C(:,14), 2.0)./ (C(:,20).*C(:,21))+ power(C(:,14), 3.0)./( C(:,20).*C(:,21).*C(:,22));

al570 = (1.0+exp(( - C(:,16).*S(:,1))./C(:,49))+C(:,14)./C(:,23))+ C(:,14)./C(:,20)+power(C(:,14), 2.0)./ (C(:,20).*C(:,21))+ power(C(:,14), 3.0)./( C(:,20).*C(:,21).*C(:,22));

al57 = A(:,57);

al571 = 1.0+ (S(:,6)./C(:,19)).*al570;

In the A(:,57) line and thus the al57 calculation, the factor (S(:,6)./C(:,19)) is only applied to the following sub-expression:

(1.0+exp(( - C(:,16).*S(:,1))./C(:,49))+C(:,14)./C(:,23))

But in the al570 and al571 lines, the factor (S(:,6)./C(:,19)) gets applied to this entire expression:

(1.0+exp(( - C(:,16).*S(:,1))./C(:,49))+C(:,14)./C(:,23))+ C(:,14)./C(:,20)+power(C(:,14), 2.0)./ (C(:,20).*C(:,21))+ power(C(:,14), 3.0)./( C(:,20).*C(:,21).*C(:,22))

You can see this by going into the editor and clicking on the opening parenthesis in the (1.0+exp... and seeing that the associated closing parenthesis is at the ...C(:,23)) part of the expression and not at the end of the line.

You need to correct your code and make sure it is calculating your source equations properly. Your differences are not due to changing the order of calculations, but are caused by doing different calculations altogether.

Etsuo Maeda
on 6 Jan 2020

"Validated numerics" will help you to understand your problem.

My best guess is that "vpa" in Symbolic Math Toolbox will show you a proper result.

HTH

Sign in to comment.

Sign in to answer this question.

Opportunities for recent engineering grads.

Apply Today
## 2 Comments

## Direct link to this comment

https://in.mathworks.com/matlabcentral/answers/498812-different-results-by-changing-the-order-of-operations#comment_783323

⋮## Direct link to this comment

https://in.mathworks.com/matlabcentral/answers/498812-different-results-by-changing-the-order-of-operations#comment_783323

## Direct link to this comment

https://in.mathworks.com/matlabcentral/answers/498812-different-results-by-changing-the-order-of-operations#comment_783366

⋮## Direct link to this comment

https://in.mathworks.com/matlabcentral/answers/498812-different-results-by-changing-the-order-of-operations#comment_783366

Sign in to comment.