PartialFractionDecomposition( WWComplex [] nCoeffs, WWComplex [] dRoots) { var result = new List <FirstOrderComplexRationalPolynomial>(); if (dRoots.Length == 1 && nCoeffs.Length == 1) { result.Add(new FirstOrderComplexRationalPolynomial(WWComplex.Zero(), nCoeffs[0], WWComplex.Unity(), WWComplex.Minus(dRoots[0]))); return(result); } if (dRoots.Length < 2) { throw new ArgumentException("denomR"); } if (dRoots.Length < nCoeffs.Length) { throw new ArgumentException("nCoeffs"); } for (int k = 0; k < dRoots.Length; ++k) { // cn = ... + nCoeffs[2]s^2 + nCoeffs[1]s + nCoeffs[0] // 係数c[0]は、s==denomR[0]としたときの、cn/(s-denomR[1])(s-denomR[2])(s-denomR[3])…(s-denomR[p-1]) // 係数c[1]は、s==denomR[1]としたときの、cn/(s-denomR[0])(s-denomR[2])(s-denomR[3])…(s-denomR[p-1]) // 係数c[2]は、s==denomR[2]としたときの、cn/(s-denomR[0])(s-denomR[1])(s-denomR[3])…(s-denomR[p-1]) // 分子の値c。 var c = WWComplex.Zero(); var s = WWComplex.Unity(); for (int j = 0; j < nCoeffs.Length; ++j) { c = WWComplex.Add(c, WWComplex.Mul(nCoeffs[j], s)); s = WWComplex.Mul(s, dRoots[k]); } for (int i = 0; i < dRoots.Length; ++i) { if (i == k) { continue; } c = WWComplex.Div(c, WWComplex.Sub(dRoots[k], dRoots[i])); } result.Add(new FirstOrderComplexRationalPolynomial( WWComplex.Zero(), c, WWComplex.Unity(), WWComplex.Minus(dRoots[k]))); } return(result); }
public WWComplex Next() { if (mFirst) { mFirst = false; return(WWComplex.Unity()); } double gn = 3.0 / 2.0 - 0.5 * ((mYi * mYi) + (mYq * mYq)); double yi = gn * (mYi * mCosθ - mYq * mSinθ); double yq = gn * (mYq * mCosθ + mYi * mSinθ); mYi = yi; mYq = yq; return(new WWComplex(yi, yq)); }
RootListToCoeffList(WWComplex [] b, WWComplex c) { var coeff = new List <WWComplex>(); if (b.Length == 0) { // 定数項のみ。(?) coeff.Add(c); return(coeff.ToArray()); } var b2 = new List <WWComplex>(); foreach (var i in b) { b2.Add(i); } // (p-b[0]) coeff.Add(WWComplex.Mul(b2[0], -1)); coeff.Add(WWComplex.Unity()); b2.RemoveAt(0); WWComplex[] coeffArray = coeff.ToArray(); while (0 < b2.Count) { // 多項式に(p-b[k])を掛ける。 var s1 = ComplexPolynomial.MultiplyX(new ComplexPolynomial(coeffArray)); var s0 = ComplexPolynomial.MultiplyC(new ComplexPolynomial(coeffArray), WWComplex.Mul(b2[0], -1)); coeffArray = ComplexPolynomial.Add(s1, s0).ToArray(); b2.RemoveAt(0); } return(ComplexPolynomial.MultiplyC(new ComplexPolynomial(coeffArray), c).ToArray()); }
public WWComplex Next() { if (mFt == 0) { return(WWComplex.Unity()); } // mFt != 0の場合。 ++mCounter; if (mCounter == mLcm) { mLcm = 0; // 位相を0にリセットします。 double gn = 3.0 / 2.0 - 0.5 * ((mYi * mYi) + (mYq * mYq)); double yi = gn; double yq = 0; mYi = yi; mYq = yq; return(new WWComplex(yi, yq)); } else { double gn = 3.0 / 2.0 - 0.5 * ((mYi * mYi) + (mYq * mYq)); double yi = gn * (mYi * mCosθ - mYq * mSinθ); double yq = gn * (mYq * mCosθ + mYi * mSinθ); mYi = yi; mYq = yq; return(new WWComplex(yi, yq)); } }
public WWComplex Evaluate(WWComplex x) { WWComplex n = WWComplex.Zero(); WWComplex xN = WWComplex.Unity(); for (int i = 0; i < numer.Length; ++i) { n = WWComplex.Add(n, WWComplex.Mul(xN, numer[i])); xN = WWComplex.Mul(xN, x); } WWComplex d = WWComplex.Zero(); xN = WWComplex.Unity(); for (int i = 0; i < denom.Length; ++i) { d = WWComplex.Add(d, WWComplex.Mul(xN, denom[i])); xN = WWComplex.Mul(xN, x); } WWComplex y = WWComplex.Div(n, d); return(y); }
public static void Test() { { /* * 部分分数分解のテスト。 * s + 3 * X(s) = ------------- * (s+1)s(s-2) * * 部分分数分解すると * * 2/3 -3/2 5/6 * X(s) = ------- + ------ + ------- * s + 1 s s - 2 */ var numerCoeffs = new WWComplex [] { new WWComplex(3, 0), new WWComplex(1, 0) }; var dRoots = new WWComplex [] { new WWComplex(-1, 0), WWComplex.Zero(), new WWComplex(2, 0) }; var p = WWPolynomial.PartialFractionDecomposition(numerCoeffs, dRoots); for (int i = 0; i < p.Count; ++i) { Console.WriteLine(p[i].ToString("s")); if (i != p.Count - 1) { Console.WriteLine(" + "); } } Console.WriteLine(""); } { // 約分のテスト // p-1 (p+1) -(p+1) + (p-1) -2 // ───── ⇒ ────────────────────── ⇒ 1 + ───── // p+1 p+1 p+1 var numerC = new List <WWComplex>(); numerC.Add(new WWComplex(-1, 0)); // 定数項。 numerC.Add(WWComplex.Unity()); // 1乗の項。 var denomR = new List <WWComplex>(); denomR.Add(new WWComplex(-1, 0)); var r = Reduction(numerC.ToArray(), denomR.ToArray()); r.Print("p"); } { // 約分のテスト // p^2+3x+2 (p^2+3x+2) -(p^2+7x+12) -4x-10 // ──────────── ⇒ 1+ ───────────────────────── ⇒ 1 + ──────────── // (p+3)(p+4) p^2+7x+12 (p+3)(p+4) var numerC = new WWComplex [] { new WWComplex(2, 0), // 定数項。 new WWComplex(3, 0), // 1乗の項。 WWComplex.Unity() }; // 2乗の項。 var denomR = new WWComplex [] { new WWComplex(-3, 0), new WWComplex(-4, 0) }; var r = Reduction(numerC, denomR); r.Print("p"); } { // 部分分数分解。 // -4x-10 2 -6 // ──────────── ⇒ ───── + ───── // (p+3)(p+4) p+3 p+4 var numerC = new WWComplex [] { new WWComplex(-10, 0), new WWComplex(-4, 0) }; var denomR = new WWComplex [] { new WWComplex(-3, 0), new WWComplex(-4, 0) }; var p = WWPolynomial.PartialFractionDecomposition(numerC, denomR); for (int i = 0; i < p.Count; ++i) { Console.WriteLine(p[i].ToString("s")); if (i != p.Count - 1) { Console.WriteLine(" + "); } } Console.WriteLine(""); } { var deriv = new RealPolynomial(new double[] { 1, 1, 1, 1 }).Derivative(); Console.WriteLine("derivative of p^3+p^2+p+1={0}", deriv.ToString("p")); } { var r2 = AlgebraicLongDivision(new RealPolynomial(new double[] { 6, 3, 1 }), new RealPolynomial(new double[] { 1, 1 })); Console.WriteLine("(p^2+3x+6)/(p+1) = {0} r {1}", r2.quotient.ToString(), r2.remainder.ToString()); } }
/// <summary> /// 1次多項式を作る。 /// mCoeffs[0] + p * mCoeffs[1] /// </summary> public static List <FirstOrderComplexRationalPolynomial> CreateFromCoeffList(WWComplex [] coeffList) { var p = new List <FirstOrderComplexRationalPolynomial>(); if (coeffList.Length == 0) { return(p); } if (coeffList.Length == 1) { // 定数を追加。 p.Add(new FirstOrderComplexRationalPolynomial(WWComplex.Zero(), coeffList[0], WWComplex.Zero(), WWComplex.Unity())); } if (coeffList.Length == 2) { // 1次式を追加。 p.Add(new FirstOrderComplexRationalPolynomial(coeffList[1], coeffList[0], WWComplex.Zero(), WWComplex.Unity())); } return(p); }