Matlab exponent bug?
    6 vues (au cours des 30 derniers jours)
  
       Afficher commentaires plus anciens
    
    Jonas Reber
      
 le 24 Nov 2011
  
    
    
    
    
    Modifié(e) : Bruno Luong
      
      
 le 7 Mar 2021
            Hello MatLabers
I have encountered a problem when calculating a non integer exponent/power of a variable.
example:
>>  -3.^(1.3)
>> ans = -4.1712
thats exactly what I aim to calculate. However, if I do the exact same thing with a variable - the result gets complex:
>> a = -3
>> a.^(1.3)
>> ans = -2.4518 - 3.3745i
is this an known issue or am I doing somehting wrong? (tested on R2010a, R2011b)
Réponse acceptée
  Daniel Shub
      
      
 le 24 Nov 2011
        This is a precedence issue: http://www.mathworks.com/help/releases/R2011a/techdoc/matlab_prog/f0-40063.html#f0-38155
Try
(-3).^(1.3)
3 commentaires
Plus de réponses (2)
  Jan
      
      
 le 24 Nov 2011
        The POWER operation has a higher precedence than the unary minus. Try this:
-3 .^ (1.3)
(-3) .^ (1.3)
  Edgar An
 le 7 Mar 2021
        
      Modifié(e) : Edgar An
 le 7 Mar 2021
  
      The problem is not about precedence. The problem occurs when we use variables instead of numbers. Just like the person who posted. 
-0.685^1.5 gives a correct answer
but a = -0.685, b = 1.5, and then a^b gives wrong answer
i am using R2020b version 
3 commentaires
  Walter Roberson
      
      
 le 7 Mar 2021
				In MATLAB, a^b is defined to be equivalent to exp(log(a)*b). When a is negative the log is complex with a πι component and if b is not an integer then the exp() of the πι*b is going to be complex.
In practice you can tell from timings that for at least some integer values a^b is not implemented through logs: for example a^2 has timing the same as a*a, but the principle is the same.
  Bruno Luong
      
      
 le 7 Mar 2021
				
      Modifié(e) : Bruno Luong
      
      
 le 7 Mar 2021
  
			To be precise for z complex (including negarive real)
log(z)
is defined in term of real-argument function log and atan2
log(abs(z)) + 1i*angle(z)
where abs(z) is
sqrt(imag(z)^2+real(z)^2) % the square "x^2" here is interpreted as (x*x)
angle(z) is
atan2(imag(z),real(z))
with all the rule we discuss recently, notably discontinuity when real(z) is negative and numeriral sign of imag(z).
The definition of 
exp(z)
has no ambiguity.
Voir également
Catégories
				En savoir plus sur Creating and Concatenating Matrices dans Help Center et File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!





