It can be done from energy principles.
Specifically
T = d/d_delta (W) where W is total energy, primarily in the airgap
Let theta be angular coordinate and delta be angle between rotor and stator fields.
B is flux density
w is energy density in airgap
W is total energy in the airgap
Then
MMFstator ~ S*cos(theta)
MMFrotor ~ R*cos(theta + delta)
MMFtotal = MMFstator + MFFrotor ~ S*cos(theta) + R*cos(theta+delta)
B ~ MMFtotal ~ S*cos(theta) + R*cos(theta+delta)
w ~ B^2 = [S*cos(theta) + R*cos(theta+delta)]^2
w ~ S^2*cos^2(theta) + R*cos(theta+delta)^2 + 2*S*R*cos(theta)*cos(theta+delta)
w ~ w1 + w2 + w3 where w1, w2, w3 are the three terms above
W = integral(w(theta), theta = 0..2*pi)
W ~ W1 + W1 + W3 where W1, W2, W3 correspond to w1,w2, w3 above
T ~ dW / d_delta
T ~T1 + T2 + T3 where T1, T2, T3 correspond to W1,W2, W3 above.
T1 ~ d/d_delta ( Int {S^2*cos^2(theta), theta=0..2*pi})
T1 ~ 0 because the item being differentiated does not depend on delta
T2 ~ d/d_delta ( Int {R^2*cos^2(theta+delta), theta=0..2*pi}))
T2 ~ 0 for the same reason. Note that delta interoduce a shift in the sinusoidal function being integrated, but since it is still integrated over a full period 0..2*P, the result does not depend on that shift.
T3 ~ d/d_delta ( Int { 2*S*R*cos(theta)*cos(theta+delta), theta=0..2*pi})
Now you need to use some trig identities to simplify
Cos(A)Cos(B) = 0.5*[cos(A+B) + cos(A-B)]
cos(theta)*cos(theta+delta) = 0.5* [cos(2*theta + delta) + cos(delta)]
T3 ~ d/d_delta ( Int { 2*S*R*0.5* [cos(2*theta + delta) + cos(delta)], theta=0..2*pi})
Remove the constants (we’re talking proportionalities)
T3 ~ d/d_delta ( Int {[cos(2*theta + delta) + cos(delta)], theta=0..2*pi})
The first term again integrates to zero. The second term integrates to cos(delta)*2*pi
When we differentiate the 2nd term we end up with sin(delta)
In additional to throwing away the constants (working with ~ instead of =), I haven't been careful to keep track of the signs (+/-). That takes a little more thought to do correctly, but we already know the answer (rotor whose field is lagging stator field is pulled in direction of the stator field... stator sees equal/opposite torque)
=====================================
(2B)+(2B)' ?