Symbolic acos( cos(theta) ) does not return theta.

6 Ansichten (letzte 30 Tage)
Stephen Pope
Stephen Pope am 31 Mär. 2023
Beantwortet: Paul am 31 Mär. 2023
While cos(acos(x)) correctly returns x, acos(cos(theta)) does not return theta.
syms theta real
assume( theta >-1 & theta < 1)
a = simplify( acos(cos(theta)) )
a = 
  1 Kommentar
Torsten am 31 Mär. 2023
assume( theta >=0 & theta <= pi)

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Walter Roberson
Walter Roberson am 31 Mär. 2023
syms theta real
assume( theta >-1 & theta < 1)
a = simplify( acos(cos(theta)) )
a = 
fplot(a, [-1 1])
If the identity holds then you would expect a straight line, not two lines.
But cos(-theta) = cos(theta) so cos(-1) = cos(1) and so acos(cos(-1)) = acos(cos(1)) rather than being able to distinguish -1 and 1

Weitere Antworten (2)

John D'Errico
John D'Errico am 31 Mär. 2023
Bearbeitet: John D'Errico am 31 Mär. 2023
Is it true, that acos(cos(theta)) ALWAYS returns theta? TRY AN EXAMPLE.
ans = 2.5664
So it is not true. It works the other way of course. at least it is mathematically true.
But the range of acos is [0,pi) for real arguments, so it cannot return a number outside that interval.
And so then acos(cos(theta)) is possibly best written as
abs(pi - mod(theta - pi,2*pi))
At least, that is the best I can find for an approximation.
fplot(@(theta) acos(cos(theta)),[-20,20],'r--')
hold on
fplot(@(theta) abs(pi - mod(theta - pi,2*pi)),[-20,20],'b:')
You can see the curves overlay on top of each other.
We can try syms, but simplify won't find that solution, even if I push it pretty hard, harder than what I did below:
syms T
ans = 
Anyway, the point is, MATLAB will not return the result you expect there, because it is not true.

Paul am 31 Mär. 2023
simplify does provide an option that returns theta:
syms theta real
assume( theta >-1 & theta < 1)
a = simplify( acos(cos(theta)),'IgnoreAnalyticConstraints',true)
a = 




Community Treasure Hunt

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

Start Hunting!

Translated by