@@ -73,10 +73,7 @@ public IExpr apply(IExpr ast) {
73
73
}
74
74
75
75
private static IExpr distributeTimes (IExpr expr ) {
76
- if (expr .isTimes ()) {
77
- return Algebra .distributeTimes (expr );
78
- }
79
- return expr ;
76
+ return Algebra .distributeTimes (expr );
80
77
}
81
78
82
79
/**
@@ -88,21 +85,22 @@ private static IExpr distributeTimes(IExpr expr) {
88
85
*/
89
86
private IExpr expandPlus (IAST ast , IAST plusAST ) {
90
87
if (ast .isSin ()) {
91
- return expandSinPlus (plusAST , 1 );
88
+ return expandCosSinPlus (plusAST , false );
92
89
} else if (ast .isCos ()) {
93
- return expandCosPlus (plusAST , 1 );
90
+ return expandCosSinPlus (plusAST , true );
91
+ // return expandCosPlus(plusAST, 1);
94
92
} else if (ast .isAST (S .Cot , 2 )) {
95
93
// Cos(x) / Sin(x)
96
- return F .Divide (expandCosPlus (plusAST , 1 ), expandSinPlus (plusAST , 1 ));
94
+ return F .Divide (expandCosSinPlus (plusAST , true ), expandCosSinPlus (plusAST , false ));
97
95
} else if (ast .isTan ()) {
98
96
// Sin(x) / Cos(x)
99
- return F .Divide (expandSinPlus (plusAST , 1 ), expandCosPlus (plusAST , 1 ));
97
+ return F .Divide (expandCosSinPlus (plusAST , false ), expandCosSinPlus (plusAST , true ));
100
98
} else if (ast .isAST (S .Csc , 2 )) {
101
99
// 1 / Sin(x)
102
- return expandSinPlus (plusAST , 1 ).inverse ();
100
+ return expandCosSinPlus (plusAST , false ).inverse ();
103
101
} else if (ast .isAST (S .Sec , 2 )) {
104
102
// 1 / Cos(x)
105
- return expandCosPlus (plusAST , 1 ).inverse ();
103
+ return expandCosSinPlus (plusAST , true ).inverse ();
106
104
} else if (ast .isAST (S .Sech , 2 )) {
107
105
return expandSechPlus (plusAST , 1 );
108
106
} else if (ast .isSinh ()) {
@@ -145,7 +143,7 @@ private IExpr expandTimes(IAST ast, IAST timesAST) {
145
143
return expandSinTimes (n , theta ).inverse ();
146
144
} else if (ast .isAST (S .Sec , 2 )) {
147
145
// 1 / Cos(x)
148
- return expandCosTimes (n , theta ).inverse ();
146
+ return expandCosTimes (n , theta ).inverse ();
149
147
} else if (ast .isSinh ()) {
150
148
int nInt = n .toInt ();
151
149
// return expandSinhPlus(F.constantArray(F.Plus, theta, nInt), 1);
@@ -209,71 +207,7 @@ private static IExpr expandSinTimes(IInteger n, IExpr theta) {
209
207
}
210
208
211
209
/**
212
- * <code>Sin(a+b+c+...)</code>
213
- *
214
- * @param plusAST
215
- * @param startPosition
216
- * @return
217
- */
218
- private static IExpr expandSinPlus (IAST plusAST , int startPosition ) {
219
- IASTAppendable result = F .PlusAlloc (2 );
220
- IExpr lhs = plusAST .get (startPosition );
221
- if (startPosition == plusAST .size () - 2 ) {
222
- IExpr rhs = plusAST .get (startPosition + 1 );
223
- result .append (Times (Sin (lhs ), Cos (rhs )));
224
- result .append (Times (Cos (lhs ), Sin (rhs )));
225
- } else {
226
- result .append (Times (Sin (lhs ), expandCosPlus (plusAST , startPosition + 1 )));
227
- result .append (Times (Cos (lhs ), expandSinPlus (plusAST , startPosition + 1 )));
228
- }
229
- return result ;
230
- }
231
-
232
- /**
233
- * <code>Sinh(a+b+c+...)</code>
234
- *
235
- * @param plusAST
236
- * @param startPosition
237
- * @return
238
- */
239
- // private static IExpr expandSinhPlus(IAST plusAST, int startPosition) {
240
- // IASTAppendable result = F.PlusAlloc(2);
241
- // IExpr lhs = plusAST.get(startPosition);
242
- // if (startPosition == plusAST.size() - 2) {
243
- // // Sinh(x)*Cosh(y) + Cosh(x)*Sinh(y)
244
- // IExpr rhs = plusAST.get(startPosition + 1);
245
- // result.append(Times(F.Sinh(lhs), F.Cosh(rhs)));
246
- // result.append(Times(F.Cosh(lhs), F.Sinh(rhs)));
247
- // } else {
248
- // result.append(Times(F.Sinh(lhs), expandCoshPlus(plusAST, startPosition + 1)));
249
- // result.append(Times(F.Cosh(lhs), expandSinhPlus(plusAST, startPosition + 1)));
250
- // }
251
- // return result;
252
- // }
253
-
254
- /**
255
- * <code>Sin(a+b+c+...)</code>
256
- *
257
- * @param plusAST
258
- * @param startPosition
259
- * @return
260
- */
261
- private static IExpr expandCosPlus (IAST plusAST , int startPosition ) {
262
- IASTAppendable result = F .PlusAlloc (2 );
263
- IExpr lhs = plusAST .get (startPosition );
264
- if (startPosition == plusAST .size () - 2 ) {
265
- IExpr rhs = plusAST .get (startPosition + 1 );
266
- result .append (Times (Cos (lhs ), Cos (rhs )));
267
- result .append (Times (CN1 , Sin (lhs ), Sin (rhs )));
268
- } else {
269
- result .append (Times (Cos (lhs ), expandCosPlus (plusAST , startPosition + 1 )));
270
- result .append (Times (CN1 , Sin (lhs ), expandSinPlus (plusAST , startPosition + 1 )));
271
- }
272
- return result ;
273
- }
274
-
275
- /**
276
- * <code>if (coshResult==true) then Cosh(a+b+c+...) else Sinh(a+b+c+...)</code>
210
+ * <code>if (coshResult==true) then TrigExand(Cosh(a+b+c+...)) else TrigExand(Sinh(a+b+c+...))</code>
277
211
*
278
212
* @param plusAST
279
213
* @param coshResult
@@ -288,34 +222,39 @@ private static IExpr expandCoshSinhPlus(IAST plusAST, boolean coshResult) {
288
222
IExpr sinhPlus = F .Plus (Times (F .Sinh (lhs ), F .Cosh (rhs )), Times (F .Cosh (lhs ), F .Sinh (rhs )));
289
223
for (int i = 3 ; i < plusAST .size (); i ++) {
290
224
lhs = plusAST .get (i );
291
- IExpr coshTemp = F .Plus (Times (F .Cosh (lhs ), coshPlus ), Times (F .Sinh (lhs ), sinhPlus ));
292
- IExpr sinhTemp = F .Plus (Times (F .Sinh (lhs ), coshPlus ), Times (F .Cosh (lhs ), sinhPlus ));
225
+ IExpr coshTemp = F .Plus (distributeTimes (Times (F .Cosh (lhs ), coshPlus )),
226
+ distributeTimes (Times (F .Sinh (lhs ), sinhPlus )));
227
+ IExpr sinhTemp = F .Plus (distributeTimes (Times (F .Sinh (lhs ), coshPlus )),
228
+ distributeTimes (Times (F .Cosh (lhs ), sinhPlus )));
293
229
coshPlus = coshTemp ;
294
230
sinhPlus = sinhTemp ;
295
231
}
296
232
return coshResult ? coshPlus : sinhPlus ;
297
233
}
234
+
298
235
/**
299
- * <code>Cosh( a+b+c+...)</code>
300
- *
236
+ * <code>if (cosResult==true) then TrigExand(Cos( a+b+c+...)) else TrigExand(Sin(a+b+c+...) )</code>
237
+ *
301
238
* @param plusAST
302
- * @param startPosition
239
+ * @param cosResult
303
240
* @return
304
241
*/
305
- // private static IExpr expandCoshPlus(IAST plusAST, int startPosition) {
306
- // IASTAppendable result = F.PlusAlloc(2);
307
- // IExpr lhs = plusAST.get(startPosition);
308
- // if (startPosition == plusAST.size() - 2) {
309
- // // Cosh(x)*Cosh(y) + Sinh(x)*Sinh(y)
310
- // IExpr rhs = plusAST.get(startPosition + 1);
311
- // result.append(Times(F.Cosh(lhs), F.Cosh(rhs)));
312
- // result.append(Times(F.Sinh(lhs), F.Sinh(rhs)));
313
- // } else {
314
- // result.append(Times(F.Cosh(lhs), expandCoshPlus(plusAST, startPosition + 1)));
315
- // result.append(Times(F.Sinh(lhs), expandSinhPlus(plusAST, startPosition + 1)));
316
- // }
317
- // return result;
318
- // }
242
+ private static IExpr expandCosSinPlus (IAST plusAST , boolean cosResult ) {
243
+ IExpr lhs = plusAST .arg1 ();
244
+ IExpr rhs = plusAST .arg2 ();
245
+ IExpr cosPlus = F .Plus (Times (Cos (lhs ), Cos (rhs )), Times (CN1 , Sin (lhs ), Sin (rhs )));
246
+ IExpr sinPlus = F .Plus (Times (Sin (lhs ), Cos (rhs )), Times (Cos (lhs ), Sin (rhs )));
247
+ for (int i = 3 ; i < plusAST .size (); i ++) {
248
+ lhs = plusAST .get (i );
249
+ IExpr cosTemp = F .Plus (distributeTimes (Times (F .Cos (lhs ), cosPlus )),
250
+ distributeTimes (Times (CN1 , Sin (lhs ), sinPlus )));
251
+ IExpr sinTemp = F .Plus (distributeTimes (Times (F .Sin (lhs ), cosPlus )),
252
+ distributeTimes (Times (F .Cos (lhs ), sinPlus )));
253
+ cosPlus = cosTemp ;
254
+ sinPlus = sinTemp ;
255
+ }
256
+ return cosResult ? cosPlus : sinPlus ;
257
+ }
319
258
320
259
/**
321
260
* <code>Csch(a+b+c+...)</code>
0 commit comments