Skip to content

Commit 5ebf293

Browse files
committed
Improve SphericalHarmonicY for negative first argument
1 parent 0ef6c0e commit 5ebf293

5 files changed

Lines changed: 41 additions & 21 deletions

File tree

symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/builtin/PolynomialFunctions.java

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,27 +1369,36 @@ public IExpr numericFunction(IAST ast, final EvalEngine engine) {
13691369
*/
13701370
private IExpr integerArgsSphericalHarmonicY(IExpr l, IExpr m, IExpr t, IExpr p,
13711371
EvalEngine engine) {
1372-
if (l.isMathematicalIntegerNonNegative() && m.isMathematicalIntegerNonNegative()) {
1373-
int n = l.toIntDefault();
1372+
if (l.isMathematicalIntegerNegative()) {
1373+
l = l.negate().subtract(F.C1);
1374+
}
1375+
// if (m.isMathematicalIntegerNegative()) {
1376+
// IExpr conjugateSphericalHarmonicY =
1377+
// F.Conjugate(integerArgsSphericalHarmonicY(l, m.negate(), t, p, engine));
1378+
// return F.Times(F.Power(F.CN1, m.negate()), conjugateSphericalHarmonicY);
1379+
// }
1380+
final IExpr ll = l;
1381+
if (ll.isMathematicalIntegerNonNegative() && m.isMathematicalIntegerNonNegative()) {
1382+
int n = ll.toIntDefault();
13741383
if (n >= 0) {
13751384
n /= 2;
1376-
if (m.lessEqual(l).isTrue()) {
1385+
if (m.lessEqual(ll).isTrue()) {
13771386
// ((-1)^m/2^(1-l)*E^(I*p*m)*Sqrt(((2*l+1)*(l-m)!)/(l+m)!)*(Sin(t)^2)^(m/2)*Sum(((-
13781387
// 1)^k*Gamma(-k+l+1/2))/(Cos(t)^(2*k-l)*2^(2*k)*k!*Gamma(-2*k+l-m+1)),{k,0,Floor(l/
13791388
// 2)}))/(Pi*Cos(t)^m)
1380-
IExpr plusSubexpr = l.plus(m.negate()).plus(F.C1);
1389+
IExpr plusSubexpr = ll.plus(m.negate()).plus(F.C1);
13811390
IExpr cosT = F.Cos(t);
13821391
IExpr sum = F.sum(
1383-
k -> F.Times(F.Power(cosT, F.Plus(F.Times(F.CN2, k), l)), F.Power(F.CN1, k),
1384-
F.Gamma(F.Plus(k.negate(), l, F.C1D2)),
1392+
k -> F.Times(F.Power(cosT, F.Plus(F.Times(F.CN2, k), ll)), F.Power(F.CN1, k),
1393+
F.Gamma(F.Plus(k.negate(), ll, F.C1D2)),
13851394
F.Power(F.Times(F.Power(F.C2, F.Times(F.C2, k)), F.Factorial(k),
13861395
F.Gamma(F.Plus(F.Times(F.CN2, k), plusSubexpr))), F.CN1)), //
13871396
0, n);
1388-
IAST sphericalHarmonicY = F.Times(F.Power(F.CN1, m), F.Power(F.C2, F.Plus(F.CN1, l)),
1397+
IAST sphericalHarmonicY = F.Times(F.Power(F.CN1, m), F.Power(F.C2, F.Plus(F.CN1, ll)),
13891398
F.Exp(F.Times(F.CI, p, m)), F.Power(F.Times(F.Pi, F.Power(cosT, m)), F.CN1),
1390-
F.Sqrt(F.Times(F.Plus(F.Times(F.C2, l), F.C1), F.Factorial(F.Subtract(l, m)),
1391-
F.Power(F.Factorial(F.Plus(l, m)), F.CN1))),
1392-
F.Power(F.Sqr(F.Sin(t)), F.Times(F.C1D2, m)), //
1399+
F.Sqrt(F.Times(F.Plus(F.Times(F.C2, ll), F.C1), F.Factorial(F.Subtract(ll, m)),
1400+
F.Power(F.Factorial(F.Plus(ll, m)), F.CN1))),
1401+
F.Power(F.Sin(t), m), //
13931402
sum);
13941403
return engine.evaluate(sphericalHarmonicY);
13951404
}
@@ -1622,8 +1631,7 @@ public IExpr evaluate(final IAST ast, EvalEngine engine) {
16221631
if (n.isNumEqualRational(F.C1D2)) {
16231632
final IExpr zDoubled = F.C2.times(z);
16241633
// (1/2, z) => (1 + 2*z)/(Sqrt(2)* Sqrt(1 + z))
1625-
return F.Times(F.C1DSqrt2, F.Plus(F.C1, zDoubled),
1626-
F.Power(F.Plus(F.C1, z), F.CN1D2));
1634+
return F.Times(F.C1DSqrt2, F.Plus(F.C1, zDoubled), F.Power(F.Plus(F.C1, z), F.CN1D2));
16271635
}
16281636
if (z.isZero()) {
16291637
// Cos((Pi*n)/2)

symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/expression/F.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2764,6 +2764,10 @@ public static IAST Complex(final IExpr a0, final IExpr a1) {
27642764
return new AST2(Complex, a0, a1);
27652765
}
27662766

2767+
public static IAST ComplexExpand(final IExpr a0) {
2768+
return new AST1(ComplexExpand, a0);
2769+
}
2770+
27672771
/**
27682772
* Create a symbolic complex number.
27692773
*

symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/reflection/system/rules/SphericalHarmonicYRules.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,6 @@ public class SphericalHarmonicYRules {
5858
Times(Sqrt(Plus(C1,Times(C2,n))),Power(Times(C2,CSqrtPi),CN1),LegendreP(n,Cos(t)))),
5959
// SphericalHarmonicY(n_Integer,m_Integer,t_,p_):=0/;n>=0&&m>n
6060
ISetDelayed(SphericalHarmonicY($p(n, Integer),$p(m, Integer),t_,p_),
61-
Condition(C0,And(GreaterEqual(n,C0),Greater(m,n)))),
62-
// SphericalHarmonicY(n_,m_,t_,p_):=0/;m==-1-n
63-
ISetDelayed(SphericalHarmonicY(n_,m_,t_,p_),
64-
Condition(C0,Equal(m,Subtract(CN1,n))))
61+
Condition(C0,And(GreaterEqual(n,C0),Greater(m,n))))
6562
);
6663
}

symja_android_library/matheclipse-core/src/test/java/org/matheclipse/core/system/PolynomialFunctionsTest.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,19 @@ public void testLegendreQ() {
407407

408408
@Test
409409
public void testSphericalHarmonicY() {
410+
// TODO
411+
check("SphericalHarmonicY(-6,5,a,b)", //
412+
"-3/32*(Sqrt(77)*E^(I*5*b)*Sin(a)^5)/Sqrt(Pi)");
413+
// TODO
414+
check("SphericalHarmonicY(-6,-5,a,b)", //
415+
"SphericalHarmonicY(-6,-5,a,b)");
416+
417+
check("SphericalHarmonicY(6,5,a,b)", //
418+
"-3/32*(Sqrt(1001)*E^(I*5*b)*Cos(a)*Sin(a)^5)/Sqrt(Pi)");
419+
check("SphericalHarmonicY(6,5,a,b)", //
420+
"-3/32*(Sqrt(1001)*E^(I*5*b)*Cos(a)*Sin(a)^5)/Sqrt(Pi)");
421+
check("SphericalHarmonicY(5,6,a,b)", //
422+
"0");
410423
check("SphericalHarmonicY(27, 5, Pi/4, 0)", //
411424
"-44580915/549755813888*Sqrt(62093031)/Sqrt(2*Pi)");
412425
check("N(SphericalHarmonicY(27, 5, Pi/4, 0),50)", //
@@ -415,8 +428,8 @@ public void testSphericalHarmonicY() {
415428
"-0.25492395213084562609690191673291502381506002910716");
416429

417430
// TODO
418-
// check("SphericalHarmonicY(1317624576693539401,{x,-3,-1/2},10007,0.5)", //
419-
// "");
431+
// check("SphericalHarmonicY(1317624576693539401,{x,-3,-1/2},10007,0.5)", //
432+
// "");
420433
check("SphericalHarmonicY(3/4, 0.5, Pi/5, Pi/3)", //
421434
"0.254247+I*0.14679");
422435
checkNumeric("SphericalHarmonicY(3/4, 0.5, Pi/5, Pi/3)", //

symja_android_library/rules/SphericalHarmonicYRules.m

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,5 @@
1616

1717
SphericalHarmonicY(n_Integer, 0, t_, p_) := (Sqrt(1+2*n)*LegendreP(n,Cos(t)))/(2*Sqrt(Pi)),
1818
SphericalHarmonicY(n_Integer, m_Integer, t_, p_) := 0
19-
/; (n>=0 && m>n),
20-
SphericalHarmonicY(n_, m_, t_, p_) := 0
21-
/; (m==(-n-1))
19+
/; (n>=0 && m>n)
2220
}

0 commit comments

Comments
 (0)