cos block error (simulink)

조회 수: 15 (최근 30일)
기범
기범 2023년 1월 14일
댓글: Paul 2023년 1월 17일
why is this happen?
cos(pi/2) = 6.123e-17??

채택된 답변

John D'Errico
John D'Errico 2023년 1월 14일
편집: John D'Errico 2023년 1월 14일
Welcome to the wonderful, wacky world of floating point arithmetic.
Is the number
format long g
pi/2
ans =
1.5707963267949
EXACTLY pi/2?
cos(pi/2)
ans =
6.12323399573677e-17
Of course not. Pi is an irrational number (even subtly worse, transcendental), so it cannot ever be represented exactly in double precision arithmetic, so not in any finite number of digits. And that means pi/2 as stored is just a tiny bit off from the exact value of pi/2. Consequently, cos(pi/2) is not EXACTLY zero. Close. To within floating point trash. But not exactly so.
If you want MATLAB to work in exact multiples of pi, you can do so, but that requires using the symbolic toolbox.
sym(pi/2)
ans = 
cos(sym(pi/2))
ans = 
0
  댓글 수: 5
기범
기범 2023년 1월 15일
Im using cos for my Quaternion,
so I need an exact value.
6.123e-17 will make error for my Quaternion.
I dont want my system slow down as you said.
Can i set 6.123e-17 to Zero in simulink?
ex) below 1*e-10 to Zero
John D'Errico
John D'Errico 2023년 1월 16일
So you would want a rather poor approximation to the cosine function for small values? That is, you would rather see an error of 1e-10, than an error of 1e-17? Why do I feel that is just a really, really, seriously bad idea? You want an exact value some of the time, but far more often, you are willing to accept a really poor approximation?
You could test to see if the absolute value is less then 1e-16, and if so, set that to zero. At last then you are not making a rather large error.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Paul
Paul 2023년 1월 14일
Base Simulink doesn't have a block that implements functions cosd or cospi. Maybe some other toolbox does. If not, both of those functions support code generation so you can use the Matlab Function block and call either (or both of them) from there.
  댓글 수: 5
기범
기범 2023년 1월 17일
For your recommend,
Im using MATLAB FUNCTION.
error : 1. The 'sym' class does not support code generation.
2. defined function or variable 'phirad'. The first assignment to a local variable
determines its class.
can u help me?
Paul
Paul 2023년 1월 17일
I never said to use syms. I did say to use cosd, etc. if you want have all your angles defined in degrees. So, if theta, phi, and psi are all in degrees on input, then we have
x = r.*sind(phi).*cosd(theta)
and similar for y and z

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Discontinuities에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by