Recur
CAUTION
此組件已重構,此文檔將作廢或改寫。
齊次 / 非齊次遞迴解答生成器
用於解以下形式的遞迴:( 最高支援三階遞迴 )
其中非齊次部分:
參數型態:
組件參數
props | type | 說明 |
---|---|---|
recurCoef | Array<Frac> | 齊次部分的係數 |
nonHomoFunc | { key: Frac } | 非齊次部分的常數 |
initConst | Array<Frac> | 初始條件 |
recurCoef
遞迴式齊次部分的係數。recurCoef = [ r1, r2, r3 ]
對應至 。
recurCoef.length
必須為 1 ~ 3,代表遞迴的階數,若為 0 會顯示錯誤訊息。recurCoef[-1]
不建議為Frac(0)
,會導致遞迴降階。
example
recurCoef = [ new Frac(-3, 2), new Frac(6) ]
代表
nonHomoFunc
遞迴式非齊次部分的常數。
nonHomoFunc = { "<k>,<bn>/<bd>": c, ... }
代表非齊次部分有一項為
參數 | 值 | 說明 |
---|---|---|
<k> | string | 多項式部分 目前只允許 0 ~ 3 |
<bn> 和 <bd> | string | 指數部分 可以透過 Frac.fromStr("<bn>/<bd>") 轉為 Frac |
c | Frac | 係數 |
example
jsnonHomoFunc = { "0,1/1": new Frac(2), "0,-2/1": new Frac(3), "2,1/2": new Frac(-1, 2) }
代表
initConst
遞迴式的初始條件initConst = [ s1, s2, s3 ]
對應至 。
必須滿足 initConst.length == recurCoef.length
example
initConst = [ new Frac(-3, 2), new Frac(6) ]
代表
遞迴變數 ( class SolveRecur
)
組件參數 recurCoef
更新時,會更新 recur = new SolveRecur(...)
variable | type | 說明 |
---|---|---|
recurCoef | Array<Frac> | 同 props.recurCoef |
cubic | SolveCubic | 特徵方程式的解 |
multiRootNum | Number (1, 2, 3 ) | cubic 的最大重根數 |
frac_multiRoot | Frac | null | cubic 的重根 |
method | return | 說明 |
---|---|---|
makeCharLatex | string | 特徵值 ( latex ) |
showNoRationalRoot | Boolean | 特徵方程式的解 |
makeMultiRootHomogLatex | string | cubic 的最大重根數 |
makeHomogFormLatex | string | cubic 的重根 |
cubic
特徵方程式的解會保存在 cubic
。
特徵方程式移項、乘 後得到三次函數 ,
這樣 1 ~ 3 階遞迴對應的函數都可以使用 SolveCubic
求特徵值。
乘 產生的 特徵值將在後續步驟被忽略,並不影響齊次解形式。
multiRootNum
特徵方程式的最大重根數。
使用 cubic.getDoubleRoot()
和 cubic.getTripleRoot()
取得二、三重根,
若不存在會得到 null
。
由於 getTripleRoot()
在數學定義上會與 getDoubleRoot()
同時存在,
所以必須先檢查三重根是否存在,再檢查二重根。
frac_multiRoot
特徵方程式的重根,若不存在重根則為 null
。
由於特徵方程式最高次數為 3,所以三重根與二重根值相同,
因此 frac_multiRoot
必等於 cubic.getDoubleRoot()
。
生成遞迴通解的形式
根據 cubic
的多種解形式和其他因素,以下列出齊次解的所有形式:
solutionType() | 額外條件 | 齊次解形式 ( 只有 為未知係數 ) | 通解運算形式 |
---|---|---|---|
TYPE_3FRAC | multiRootNum == 1 | TYPE_NORMAL Frac 型態 | |
TYPE_3FRAC | multiRootNum == 2 | TYPE_NORMAL Frac 型態 | |
TYPE_3FRAC | multiRootNum == 3 | TYPE_NORMAL Frac 型態 | |
TYPE_FRAC_QUAD | cubic.quad.s | 會自動轉為 TYPE_3FRAC | - |
TYPE_FRAC_QUAD | cubic.quad.s | TYPE_SQRT Frac 型態 | |
TYPE_FRAC_QUAD | cubic.quad.s | | TYPE_SQRT Frac 型態 |
TYPE_3REAL | - | TYPE_NORMAL float 型態 | |
TYPE_REAL_IM | - | | TYPE_SQRT float 型態 |
解題步驟
解題步驟的實作細節。
顯示遞迴關係式
使用 RanMath
的 makeRecurLatex
製作。
step1 - 齊次部分
顯示 " "
對應至 makeRecurHomogLatex()
- 利用
mlTerm(frac_r, "a_{n-${i+1}}", 1)
生成出 " " - 將每一項的 latex 字串拼接起來,此時為 " "。
若mlTerm
回傳+0
代表該項為 0,不顯示。 - 若拼接完成的字串為
""
,代表所有齊次遞迴係數都為 0,顯示 " "。 - 開頭要加上 " ",所以如果 latex 字串開頭為 + 要去除。
step1 - 特徵方程式
顯示 " ", 為遞迴階數。
- 利用
mlTerm(frac_r, "t", l-i-1)
生成出 " "。
2, 3, 4 步與 step1 - 齊次部分 類似。
step1 - 特徵值
顯示特徵方程式的解。
對應至 recur.makeCharLatex()
當遞迴階數 == ( recurCoef.length ) | makeCharLatex() 回傳 | 說明 |
---|---|---|
未傳入遞迴 | ? | - |
1 | recurCoef[0].toLatex() | 特徵多項式 的特徵值為 |
2 | cubic.quad.toLatex() | 因為 cubic.frac_r1 必為 0 直接回傳二次函數的解 ( latex ) |
3 | cubic.toLatex() | 三次函數的解 ( latex ) |
step1 - 不存在有理數特徵值的提醒
如果特徵方程式不存在有理根,顯示 "(!) 不存在有理根" 的訊息在特徵值右側。
對應至 recur.showNoRationalRoot()
cubic.frac_r1 === undefined
與type !== SolveCubic.TYPE_3FRAC && type !== SolveCubic.TYPE_FRAC_QUAD
等價。
cubic.solutionType()
若不為 SolveCubic.TYPE_3FRAC
或 SolveCubic.TYPE_FRAC_QUAD
,
則三次函數不存在有理數根,後續計算都採浮點運算。
顯示的浮點數值都到小數點後四位。
step1 - 重根提示
如果特徵方程式有重根特徵值,顯示 " 有 n 重根 ?,需要設 ... 保證線性獨立 "。
對應至 recur.makeMultiRootHomogLatex()
if multiRootNum == | makeMultiRootHomogLatex() 回傳 |
---|---|
1 | " " |
2 | " " |
3 | " " |
由 mlTerm(1, dRoot, "n", false)
生成。
step1 - 齊次解的形式
顯示齊次解
對應至 recur.makeHomogFormLatex()
使用 makeExpLatex("h_i ", frac_r)
來製作 " " ( latex )
if solutionType() == | if multiRootNum == | makeHomogFormLatex() 回傳 |
---|---|---|
TYPE_3FRAC | 3 | multiRootHomogLatex |
TYPE_3FRAC | 2 | multiRootHomogLatex + " " ( 剩餘根 ) |
TYPE_3FRAC | 1 | " " |
TYPE_FRAC_QUAD | 無重根 | cubic.quad.toLatex() 回傳的解一定包含 " "將 替換為 和 來製作兩個根的 latex, 加上剩餘一根 cubic.frac_r1 後回傳 |
TYPE_3REAL | 無重根 | " " |
TYPE_REAL_IM | 無重根 | " " |