Skip to content

RecurNonHomogExp

CAUTION

此組件已重構,此文檔將作廢或改寫。

WARNING

這個組件是 RecurNonHomog.vue 拆分出的子組件,你不應該單獨使用它。

用於計算非齊次遞迴的特解當中的未知係數 pjp_j,並且顯示計算過程。

描述

遞迴的非齊次部分:

F(n)=ifi(n)bin=(c1+c2n+c3n2+)bin+F(n) = \sum\limits_i f_i(n) {b_i}^n = (c_1 + c_2 n + c_3 n^2 + \cdots) {b_i}^n + \cdots

以下是已經假設完成的特解形式:

an(p)=igi(n)nkibin=(p1+p2n+p3n2+)nkibin+a_n^{(p)} = \sum\limits_i g_i(n) n^{k_i} {b_i}^n = (p_1 + p_2 n + p_3 n^2 + \cdots) n^{k_i} {b_i}^n + \cdots

其中

  • fi(n)f_i(n)gi(n)g_i(n) 皆為多項式,且次數相同。
  • biQ , bi0b_i \in \mathbb{Q} ~,~ b_i \neq 0,非齊次部分的已知底數。
  • ciQc_i \in \mathbb{Q} ,為非齊次部分的已知係數。
  • 當齊次與非齊次部分都存在相同的指數部分 bin{b_i}^n 時,需要額外乘上 nkin^{k_i} 保證線性獨立。
  • pjp_j 為要計算的未知係數。

根據係數比較法可知:
不同 bin{b_i}^n 對應的多項式 gi(n)g_i(n) 彼此獨立,因此可以分別計算未知係數 pjp_j。( 分治法 )

因此本組件只計算某個 bin{b_i}^n 的部分,將 F(n)F(n)an(p)a_n^{(p)} 視為:

F(n)=f(n)bn=(c0+c1n+c2n2+)bnF(n) = f(n) b^n = (c_0 + c_1 n + c_2 n^2 + \cdots) b^n

an(p)=g(n)nkbn=(ps+ps+1n+ps+2n2+)nkbna_n^{(p)} = g(n) n^k b^n = (p_{s} + p_{s+1} n + p_{s+2} n^2 + \cdots) n^k b^n

組件參數

props.TypeDescription
recurCoefArray<Frac>齊次部分的係數,.length 代表遞迴階數
frac_bFrac指數項 bnb^nbb
polyCoefArray<Frac>多項式 f(n)f(n) 的係數 cic_i
extraNPownumber ( int )為保持特解的線性獨立性,額外乘上去的 nkn^k
startPjnumber ( int )未知係數 psp_s 的編號 ss
_mlExpTermFunction:
(boolean, number) => string
來自 RecurNonHomog.vue 的閉包
注意: s_frac_b 已被傳入
只需給予 isUnknownCoefextraNPow

recurCoef

RecurNonHomg - recurCoef

frac_b

指數項 bnb^nbb,範例請參照 polyCoef

polyCoef

多項式 f(n)f(n) 的係數 cic_i

Example

js
frac_b = new Frac(-3);
polyCoef = [ new Frac(4), new Frac(0), new Frac(-7, 2) ];

代表

F(n)=(4+72n2)(3)nF(n) = (-4 + \frac{-7}{2} n^2) (-3)^n

extraNPow

當齊次與非齊次部分都存在相同的指數部分 bin{b_i}^n 時,需要額外乘上 nkn^k 保證線性獨立。

  • an(h)a_n^{(h)} 存在 bin{b_i}^n 項,需要額外乘上 n1n^1,變成 (psn+ps+1n2+)bin(p_s n + p_{s+1} n^2 + \cdots) {b_i}^n
  • an(h)a_n^{(h)} 存在 bin{b_i}^nnbinn {b_i}^n 項,需要額外乘上 n2n^2,變成 (psn2+ps+1n3+)bin(p_s n^2 + p_{s+1} n^3 + \cdots) {b_i}^n

以此類推

範例請參照 startPj

startPj

因為每個 bin{b_i}^n 的部分是分開計算的,需要對未知係數 pjp_j 編號,方便後續解答的合併。

Example

js
frac_b = new Frac(-3);
polyCoef = [ new Frac(4), new Frac(0), new Frac(-7, 2) ];
extraNPow = 2;
startPj = 3;

由於 fi(n)f_i(n)gi(n)g_i(n) 的次數相同,因此

an(p)=(p3+p4n+p5n2)n2(3)na_n^{(p)} = (p_3 + p_4 n + p_5 n^2) n^2 (-3)^n

_mlExpTerm

來自 RecurNonHomog - _mlExpTerm 的閉包。

注意: s_frac_b 已在 RecurNonHomog.vue 內被傳入
只需給予 isUnknownCoefextraNPow

emit

emitTypeDescription
PjAnswerArray<Frac>特解形式中的 bin{b_i}^n 對應的多個未知係數 pjp_j 的計算結果

PjAnswer

當未知係數 pjp_j 計算完成時,上傳結果至 RecurNonHomog.vue

Example

js
expData.startPj = 3;
PjAnswer = [ new Frac(-2, 7), new Frac(6), new Frac(3, 4) ];

表示:

p3=27  ,  p4=6  ,  p5=34p_3 = \frac{-2}{7} ~~,~~ p_4 = 6 ~~,~~ p_5 = \frac{3}{4}

SolveNonHomogExp 的變數

建構子參數 recurCoeffrac_bpolyCoefextraNPowstartPj組件參數

this.TypeDescription
recurLevelnumber ( int )遞迴階數
PjNumnumber ( int )未知係數 pjp_j 的數量
PjLinearEquationArray<Array<Frac>>an(p)a_n^{(p)}pjp_j 表示的線性關係
nonHomogFnArray<Frac>將常數代入非齊次部分 F(n)F(n) 得到的值
matrix_solvePjMatrix用於解 pjp_j 的聯立方程式方陣
PjAnswerArray<Frac>算出的特解係數 pjp_j

recurLevel

遞迴階數,與 recurCoef.length 的值相同。

PjNum

未知係數 pjp_j 的數量。

等於多項式 g(n)g(n) 的次數,
又因為 f(n)f(n)g(n)g(n) 的次數相同,且 f(n)f(n) 的次數與 polyCoef.length 相同,
因此 PjNum == polyCoef.length

PjLinearEquation

an(p)a_n^{(p)} 代入自然數 nn 之後,以未知數 pjp_j 表示的線性關係。

會在 SolveNonHomogExp._initPjLinearEquation() 內計算。

展開特解的形式:( kkextraNPow )

an(p)=(ps+ps+1n+ps+2n2+)nkbna_n^{(p)} = (p_{s} + p_{s+1} n + p_{s+2} n^2 + \cdots) n^k b^n

=(nkbn)ps+(nk+1bn)ps+1+(nk+2bn)ps+2+= (n^k b^n) p_s + (n^{k+1} b^n) p_{s+1} + (n^{k+2} b^n) p_{s+2} + \cdots

coef 回傳 an(p)a_n^{(p)} 內未知數 ps+ip_{s+i} 的係數:

coef(n,i)=nk+ibn\text{coef}(n, i) = n^{k+i} b^n

nonHomogFn

將常數代入非齊次部分 F(n)F(n) 得到的值。

會在 SolveNonHomogExp._initNonHomogFn() 內計算。

matrix_solvePj

用於解 pjp_j 的聯立方程式方陣。

會在 SolveNonHomogExp._initPjEquationSystem() 內計算。

PjAnswer

算出的特解係數 pjp_j

會在 SolveNonHomogExp._initSolvePj() 內計算。

SolveNonHomogExp 的方法

mlmakeLatex 的縮寫。

MethodReturnDescription
_initPjLinearEquationvoid計算 PjLinearEquation
_initNonHomogFnvoid計算 nonHomogFn
_initPjEquationSystemvoid計算 matrix_solvePj
_initSolvePjvoid計算 PjAnswer
mlExpstring回傳 " bnb^n " ( LaTeX )
mlSomePjstring回傳未知係數 pjp_j 的範圍
( LaTeX )
mlNRangestring回傳需要代入的 nn 值範圍
( LaTeX )
mlParticularLinearEquationstring回傳 F(n)F(n)an(p)a_n^{(p)} 表示的線性關係
( LaTeX )
mlPjLinearEquationstring回傳 an(p)a_n^{(p)}pjp_j 表示的線性關係
( LaTeX )
mlSolvePjEquationSystemstring回傳 pjp_j 的聯立方程組
( LaTeX )
mlPjAnswerstring回傳 pjp_j 的答案 ( LaTeX )

組件顯示的解題過程

計算 an(p)a_n^{(p)} 之中,指數項 expData.mlExp() 對應的 expData.PjNum 個未知係數 expData.mlSomePj(), 需要將 expData.mlNRange() 代入式 ( 1 ),
產生 expData.PjNum 個式子的線性方程組,並解聯立:

expData.mlParticularLinearEquation()

其中 F(n)=F(n) = _mlExpTerm(false, 0)
an(p)=a_n^{(p)} = _mlExpTerm(true, extraNPow),代入常數後得到:

expData.mlPjLinearEquation()

展開後得到:

expData.mlSolvePjEquationSystem()

使用高斯消去法解 pjp_j 的聯立方程式,得到:

expData.mlPjAnswer()

ref 變數

refTypeDescription
expDataSolveNonHomogExp未知係數 pjp_j 的計算結果

expData

未知係數 pjp_j 的計算結果,計算所需的變數和方法都封裝在內。

當組件參數 recurCoeffrac_bpolyCoefextraNPowstartPj 改變時會更新此值。

解題過程

以下示範如何解

an(p)+5an1(p)+6an2(p)=F(n) , n2a_n^{(p)} + 5a_{n-1}^{(p)} + 6a_{n-2}^{(p)} = F(n) ~,~ n \ge 2

F(n)=(2n+2n2)1nF(n) = (-2 -n + 2n^2) 1^n

an(p)=(p1+p2n+p3n2)n01na_n^{(p)} = (p_1 + p_2 n + p_3 n^2) n^0 1^n

的未知係數 pjp_j

Step1 生成線性關係

因為未知係數 pjp_j 有 3 個,需要生成 3 個式子才能解 pjp_j 的聯立,
因為 n2n \ge 2,所以將 2 ~ 4 代入遞迴式產生 3 個式子的線性方程組,並解聯立:

[a2(p)+5a1(p)+6a0(p)a3(p)+5a2(p)+6a1(p)a4(p)+5a3(p)+6a2(p)]=[F(2)F(3)F(4)]\begin{bmatrix} a_2^{(p)} + 5a_1^{(p)} + 6a_0^{(p)} \\ a_3^{(p)} + 5a_2^{(p)} + 6a_1^{(p)} \\ a_4^{(p)} + 5a_3^{(p)} + 6a_2^{(p)} \end{bmatrix} = \begin{bmatrix} F(2) \\ F(3) \\ F(4) \end{bmatrix}

其中

[a0(p)a1(p)a2(p)a3(p)a4(p)]=[p1p1+p2+p3p1+2p2+4p3p1+3p2+9p3p1+4p2+16p3]\begin{bmatrix} a_0^{(p)} \\ a_1^{(p)} \\ a_2^{(p)} \\ a_3^{(p)} \\ a_4^{(p)} \end{bmatrix} = \begin{bmatrix} p_1 \\ p_1 +p_2 +p_3 \\ p_1 +2p_2 +4p_3 \\ p_1 +3p_2 +9p_3 \\ p_1 +4p_2 +16p_3 \end{bmatrix}

Step2 展開聯立方程式

[F(2)F(3)F(4)]=[a2(p)+5a1(p)+6a0(p)a3(p)+5a2(p)+6a1(p)a4(p)+5a3(p)+6a2(p)]=[651000651000651][a0(p)a1(p)a2(p)a3(p)a4(p)]\begin{bmatrix} F(2) \\ F(3) \\ F(4) \end{bmatrix} = \begin{bmatrix} a_2^{(p)} + 5a_1^{(p)} + 6a_0^{(p)} \\ a_3^{(p)} + 5a_2^{(p)} + 6a_1^{(p)} \\ a_4^{(p)} + 5a_3^{(p)} + 6a_2^{(p)} \end{bmatrix} = \begin{bmatrix} 6 & 5 & 1 & 0 & 0 \\ 0 & 6 & 5 & 1 & 0 \\ 0 & 0 & 6 & 5 & 1 \end{bmatrix} \begin{bmatrix} a_0^{(p)} \\ a_1^{(p)} \\ a_2^{(p)} \\ a_3^{(p)} \\ a_4^{(p)} \end{bmatrix}

[a0(p)a1(p)a2(p)a3(p)a4(p)]=[p1p1+p2+p3p1+2p2+4p3p1+3p2+9p3p1+4p2+16p3]=[1001111241391416][p1p2p3]\begin{bmatrix} a_0^{(p)} \\ a_1^{(p)} \\ a_2^{(p)} \\ a_3^{(p)} \\ a_4^{(p)} \end{bmatrix} = \begin{bmatrix} p_1 \\ p_1 +p_2 +p_3 \\ p_1 +2p_2 +4p_3 \\ p_1 +3p_2 +9p_3 \\ p_1 +4p_2 +16p_3 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 \\ 1 & 1 & 1 \\ 1 & 2 & 4 \\ 1 & 3 & 9 \\ 1 & 4 & 16 \end{bmatrix} \begin{bmatrix} p_1 \\ p_2 \\ p_3 \end{bmatrix}

因此 pjp_j 的聯立方程式為:

[F(2)F(3)F(4)]=[651000651000651][1001111241391416][p1p2p3]=AB[p1p2p3]\begin{bmatrix} F(2) \\ F(3) \\ F(4) \end{bmatrix} = \begin{bmatrix} 6 & 5 & 1 & 0 & 0 \\ 0 & 6 & 5 & 1 & 0 \\ 0 & 0 & 6 & 5 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 1 & 1 & 1 \\ 1 & 2 & 4 \\ 1 & 3 & 9 \\ 1 & 4 & 16 \end{bmatrix} \begin{bmatrix} p_1 \\ p_2 \\ p_3 \end{bmatrix} = AB \begin{bmatrix} p_1 \\ p_2 \\ p_3 \end{bmatrix}

展開後得到:

AB[p1p2p3]=[1279121935123185][p1p2p3]=[41326]=FAB \begin{bmatrix} p_1 \\ p_2 \\ p_3 \end{bmatrix} = \begin{bmatrix} 12 & 7 & 9 \\ 12 & 19 & 35 \\ 12 & 31 & 85 \end{bmatrix} \begin{bmatrix} p_1 \\ p_2 \\ p_3 \end{bmatrix} = \begin{bmatrix} 4 \\ 13 \\ 26 \end{bmatrix} = F

Step3 解聯立方程式

由於 ABAB 一定可逆,( 如果不可逆的話,比較係數法根本不成立 )
因此

[p1p2p3]=(AB)1F=P\begin{bmatrix} p_1 \\ p_2 \\ p_3 \end{bmatrix} = (AB)^{-1} F = P

這一步會在 SolveNonHomogExp._initSolvePj() 內運算:

  1. 套上一層 Array 變成 [this.nonHomogFn],因為 Matrix 建構子要求輸入一個二維陣列。
  2. 傳入 Matrix,此時矩陣為 [41326]\begin{bmatrix} 4 & 13 & 26 \end{bmatrix}
  3. 轉置後變為矩陣 FF
  4. (AB)1F(AB)^{-1} F
  5. 因為要轉為 Array,所以要將 PP 轉置。
  6. .A 回傳一個二維矩陣,但 PP 是個向量,因此 .A[0] 即可取出 this.PjAnswer