-1

I have to compute the value of this expression (e1*cos(θ) - e2*sin(θ)) / ((cos(θ))^2 - (sin(θ))^2)

Here e1 and e2 are some complex expression.

In the case when θ approach to PI/4, then the denominator will approach to zero. But in that case e1 and e2 will also approach to same value. So at PI/4, the value of expression will be E/sqrt(2) where e1=e2=E

I can do special handing for θ=PI/4 but what about the value of θ very very near to PI/4. What is the general strategy to compute such kind of expressions

x64
  • 332
  • 1
  • 4
  • 13

1 Answers1

1

This is a bit tricky. You need to know more about how e1 and e2 behave.

First, some notation: I'll use the variable a = theta - pi/4, so that we are interested in a->0, and write e1 = E + d1, e2 = E + d2. Let F = your expression times sqrt(2)

In terms of these we have

F = ((E+d1)*(cos(a) - sin(a)) - (E+d2)*(cos(a) + sin(a))) / - sin( 2*a)
  = (-(2*E+d1+d2)*sin(a) + (d1-d2)*cos(a)) / (-2*sin(a)*cos(a))
  = (E+(d1+d2)/2)/cos(a) - (d1-d2)/(2*sin(a))

Assuming that d1->0 and d2->0 as a->0 the first term will tend to E. However the second term could tend to anything, or blow up -- for example if d1=d2=sqrt(a).

We need to assume more, for example that d1-d2 has derivative D at a=0. In this case we will have

F-> E - D/2 as a->0

To be able to compute F for values of a close to 0 we need to know even more. One approach is to have code like this:

if ( fabs(a) < small) { F = E-D/2 + C*a; } else { F = // normal code }

So we need to figure out what 'small' and C should be. In part this depends on what (relative) accuracy you require. The most stringent requirement would be that at a = +- small, the difference between the approximation and the normal code should be too small to represent in a double (if that's what you're using). But note that we mustn't make 'small' too small, or there is a danger that, as doubles, the normal code will evaluate to 0/0 at a += small. One approach would be to expand the numerator and denominator of F (or just the second term) as power series (to say second order), divide each by a, and then divide these series, keeping terms up to second order; the first term in this gives you C above, and the second term will allow you to estimate the error in this approximation, and hence estimate 'small'.

dmuir
  • 4,211
  • 2
  • 14
  • 12