Skip to content

RecurNonHomog

CAUTION

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

WARNING

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

用於計算非齊次遞迴的特解,並且顯示計算過程。

描述

輸入遞迴的非齊次部分

F(n)=c1nk1b1n+c2nk2b2n+F(n) = c_1 n^{k_1} {b_1}^n + c_2 n^{k_2} {b_2}^n + \cdots

ci , biQ;ki{0,1,2,3}c_i ~,~ b_i \in \mathbb{Q} \quad;\quad k_i \in \{ 0, 1, 2, 3 \}

輸出遞迴的特解

an(p)=p1nk1b1n+p2nk2b2n+a_n^{(p)} = p_1 n^{k_1} {b_1}^n + p_2 n^{k_2} {b_2}^n + \cdots

pi , biQ;kiNp_i ~,~ b_i \in \mathbb{Q} \quad;\quad k_i \in \mathbb{N}

組件參數

props.TypeDescription
recurCoefArray<Frac>齊次部分的係數
nonHomoFunc{ key: Frac }非齊次部分的常數
cubicSolveCubic來自 Recur.vue 的特徵方程式的解
recurNonHomogLatexstringlink 待補

recurCoef

Recur - recurCoef

nonHomoFunc

Recur - nonHomoFunc

cubic

link 待補。

recurNonHomogLatex

link 待補。

emit

emitTypeDescription
particular{ key: Array<Frac> }非齊次遞迴的特解

particular

非齊次遞迴的特解,由 SolveNonHomog.getParticular 生成。

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

Example

js
particular = [
	"1/1": [ new Frac(0), new Frac(-2), new Frac(6) ],
	"-2/3": [ new Frac(-2, 7) ],
	"-3/1": [ new Frac(0), new Frac(0), new Frac(1) ]
];

表示:

an(p)=2n+6n2+27(23)n+n2(3)na_n^{(p)} = -2n + 6n^2 + \frac{-2}{7} \left( \frac{-2}{3} \right)^n + n^2 (-3)^n

SolveNonHomog 的變數

建構子參數 recurCoefnonHomoFunccubic組件參數

this.TypeDescription
recurLevelnumber ( int )遞迴階數
combinedExpFunc{ key: Array<Frac> }含有相同指數項 bin{b_i}^n 的多項式之中的係數
varPjIndex{ key: Array<number> }特解的未知係數 pjp_j 的編號 jj
PjNumnumber ( int )特解的未知係數 pjp_j 的數量
homogRootConflictNum{ key: number }齊次解的某個特徵值 bb 的重根數
bnb^nan(p)a_n^{(p)}

recurLevel

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

combinedExpFunc

非齊次部分 nonHomoFunc 的形式為 icinkibin\sum\limits_i c_i n^{k_i} {b_i}^n ,合併含有相同 bin{b_i}^n 的項,
轉為 combinedExpFuncifi(n)bin\sum\limits_i f_i(n) {b_i}^n 形式。

會在 SolveNonHomog._initCombineExp() 內計算。

Example

js
nonHomoFunc = {
	"0,-2/1": new Frac(3),
	"1,-2/1": new Frac(3, 2),
	"2,-2/5": new Frac(-6)
};

表示 3(2)n+32n(2)n6n2(25)n3 (-2)^n + \frac{3}{2} n (-2)^n -6 n^2 (\frac{-2}{5})^n

\downarrow

轉為 (3+32n)(2)n+(6n2)(25)n( 3 + \frac{3}{2} n )(-2)^n + ( -6 n^2 )(\frac{-2}{5})^n

js
combinedExpFunc = {
	"-2/1": [ new Frac(3), new Frac(3, 2) ],
	"-2/5": [ new Frac(0), new Frac(0), new Frac(-6) ]
};

varPjIndex

特解當中的未知係數 pjp_j 的編號 jj

因為特解 an(p)a_n^{(p)} 之中假設的 gi(n)g_i(n) 的次數要跟非齊次部分 F(n)F(n) 當中的 fi(n)f_i(n) 相同,
所以結構與 combinedExpFunc 相同。

會在 SolveNonHomog._initNumberTheUnknownPj() 內計算。

Example

js
combinedExpFunc = {
	"1/1": [ new Frac(0), new Frac(2) ],
	"-2/1": [ new Frac(3), new Frac(3, 2) ],
	"-2/5": [ new Frac(0), new Frac(0), new Frac(-6) ]
};

若非齊次部分為:

F(n)=ifi(n)bin=(2n)1n+(3+32n)(2)n+(6n2)(25)nF(n) = \sum\limits_i f_i(n) {b_i}^n = (2n)1^n + ( 3 + \frac{3}{2} n )(-2)^n + ( -6 n^2 )(\frac{-2}{5})^n

猜測特解的形式為:

an(p)=igi(n)bin=(p1+p2n)1n+(p3+p4n)(2)n+(p5+p6n+p7n2)(25)na_n^{(p)} = \sum\limits_i g_i(n) {b_i}^n = (p_1 + p_2 n)1^n + ( p_3 + p_4 n )(-2)^n + ( p_5 + p_6 n + p_7 n^2 )(\frac{-2}{5})^n

js
varPjIndex = {
	"1/1": [ 1, 2 ],
	"-2/1": [ 3, 4 ],
	"-2/5": [ 5, 6, 7 ]
};

PjNum

特解的未知係數 pjp_j 的數量。

參考上個範例的 varPjIndex,可知 PjNum = 7

會在 SolveNonHomog._initNumberTheUnknownPj() 內計算。

homogRootConflictNum

當齊次與非齊次部分都存在相同的指數部分 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

以此類推

會在 SolveNonHomog._initConflictRoot() 內計算。

Example
若齊次部分為 an(h)=h11n+h2(2)n+h3n(2)na_n^{(h)} = h_1 1^n + h_2 (-2)^n + h_3 n (-2)^n
非齊次部分為 an(p)=(p1+p2n)1n+p3(2)n+p43na_n^{(p)} = (p_1 + p_2 n) 1^n + p_3 (-2)^n + p_4 3^n

js
homogRootConflictNum = { "1/1": 1, "-2/1": 2 };

SolveNonHomogExp 的方法

mlmakeLatex 的縮寫。

MethodReturnDescription
_initCombineExpvoid計算 combinedExpFunc
_initNumberTheUnknownPjvoid計算 varPjIndexPjNum
_initConflictRootvoid計算 homogRootConflictNum
_mlExpTermstring生成 " (+n+n2+)bn(* + *n + *n^2 + \cdots) b^n "
( LaTeX )
mlCombinedExpstring合併後的齊次部分 ( LaTeX )
mlParticularFormstring假設的特解形式 ( LaTeX )
mlExistHomogExpstring齊次部分之中的相同指數項 bin{b_i}^n
( LaTeX )
mlExistParticularExpstring特解形式之中的相同指數項 bin{b_i}^n
( LaTeX )
mlChangeExpListArray<[string, string]>特解乘上 nkn^k 的前後變化 ( LaTeX )
mlNewParticularFormstring新的特解形式 ( LaTeX )
mlParticularIntoRecurstringan(p)a_n^{(p)} 填入原遞迴關係 ( LaTeX )
mlParticularIntoRecurTransstringmlParticularIntoRecur
移項後的結果 ( LaTeX )
mlParticularIntoRecurWherestring再顯示一次 mlNewParticularForm
mlCombinedExp ( LaTeX )
mlParticularstring計算完成的特解 ( LaTeX )
getParticular{ key: Array<Frac> }生成特解的資訊,
用於 emitRecur.vue

_mlExpTerm

_mlExpTerm(s_frac_b, isUnknownCoef, extraNPow = 0) -> string
生成 " (+n+n2+)bn(* + *n + *n^2 + \cdots) b^n " 形式的 latex 語法。

ParamTypeDescription
s_frac_bstringbnb^n 的底數 bb,會透過 Frac.fromStr 轉為 Frac
isUnknownCoefbooleanisUnknownCoef == true 生成 " (ps+ps+1n+)bn(p_s + p_{s+1}n + \cdots) b^n " ( 特解 )
其中 pjp_j 為未知係數
isUnknownCoef == false 生成 " (cs+cs+1n+)bn(c_s + c_{s+1}n + \cdots) b^n " ( 非齊次 )
其中 cjc_j 為已知係數
extraNPownumber將生成結果乘上 nkn^k
可以參考 homogRootConflictNum

mlParticular

計算完成的特解的 latex。

getParticular

生成特解的資訊,用於 emitRecur.vue

回傳值的範例請參考 particular

組件顯示的解題過程

遞迴的非齊次部分為

props.recurNonHomogLatex

合併相同的指數項:

F(n)=ifi(n)bin=recur.mlCombinedExp()F(n) = \sum\limits_{i} f_i(n) {b_i}^n = \text{recur.mlCombinedExp()}

猜測特解的形式為:

recur.mlParticularForm()

其中多項式 gi(n)g_i(n) 的次數應與 fi(n)f_i(n) 相同。

檢查齊次解 an(h)a_n^{(h)} 和特解 an(p)a_n^{(p)} 之中是否存在相同的指數部分 bin{b_i}^n

如果...顯示的 ui ( 解題過程 )
存在由於 recur.mlExistHomogExp() 已出現在 an(h)a_n^{(h)} 之中,
若特解 an(p)a_n^{(p)} 也包含同樣項次 recur.mlExistParticularExp() 會導致與齊次解重疊,
為了保證特解與齊次解的線性獨立性,需要將
- 以下遍歷 recur.mlChangeExpList() 產生的列表 -
... 改為 ...
... 改為 ...
不存在\Rightarrow 不存在相同的指數部分。

因此特解的形式為:

recur.mlNewParticularForm()

an(p)a_n^{(p)} 代入原遞迴關係: ( 將 ana_n 替換為 an(p)a_n^{(p)} 即可,不要將形式代入 )

recur.mlParticularIntoRecur()

移項後得到: ( 式 1 )

recur.mlParticularIntoRecurTrans()

其中

recur.mlParticularIntoRecurWhere()

接下來需要對每個指數項 bin{b_i}^n 對應的多項式,分別求未知係數 pjp_j

...
一些組件 RecurNonHomogExp.vue
...

pjp_j 代回 an(p)a_n^{(p)},得到特解為

particularLatex

ref 變數

refTypeDescription
recurSolveNonHomog特解的未知係數 pjp_j 的計算過程
PjBuffer{ key: Array<Frac> }用於暫存多個 RecurNonHomogExp.vue 回傳的 pjp_j
particularLatexstring計算完成的特解 ( LaTeX )

recur

特解的未知係數 pjp_j 的計算過程,計算所需的變數和方法都封裝在內。

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

PjBuffer

用於暫存多個 RecurNonHomogExp.vue 回傳的 pjp_j

particularLatex

計算完成的特解 ( LaTeX ),由 SolveNonHomogExp.mlParticular 生成。

解題過程

請自行至 app 內測試。