使用MuPAD求解差分方程组遇变量定义问题,求正确解法
解决MuPAD中求解该线性方程组的问题
首先得指出你之前代码的核心问题:没有把两个边界条件(x[1]=1和x[50]-x[49]=h)加入到方程列表eqs中,导致方程数量(48个递推式)远少于变量数量(50个),自然无法得到唯一解。下面给你两种可行的解决方法:
方法一:直接构建完整线性方程组,用数值解法求解
这种方法不需要推导通解,直接把所有约束条件整合起来交给MuPAD的线性求解器处理,步骤很直观:
# 定义步长h h := 0.1; # 构建完整的方程列表:边界条件1 + 递推方程(i=2到49) + 边界条件2 eqs := [x[1] = 1] + [x[i-1] - (2 - h^2)*x[i] + x[i+1] = 0 $ i = 2..49] + [x[50] - x[49] = h]; # 定义所有待求解的变量 vars := [x[i] $ i = 1..50]; # 调用数值线性求解器 sol := numeric::linsolve(eqs, vars);
这里用MuPAD的$符号快速生成序列,把三个部分的方程合并成包含50个方程的列表,刚好对应50个变量,求解器就能返回每个x[i]的数值结果了。
方法二:先求递推关系的通解,再代入边界条件计算
如果你想理解解的解析形式,可以先推导递推方程的通解,再用边界条件确定常数,最后计算每个x[i]:
步骤1:推导递推方程的通解
你的递推方程是二阶线性齐次递推:x[n+1] - (2 - h²)x[n] + x[n-1] = 0,对应的特征方程为:r² - (2 - h²)r + 1 = 0
代入h=0.1计算,特征根是一对共轭复数,可以表示为r = e^(±iθ),其中θ = arccos(1 - h²/2),因此通解形式为:x[n] = A·cos((n-1)θ) + B·sin((n-1)θ)
步骤2:用边界条件确定常数A和B
- 由
x[1]=1,代入n=1得:A·cos(0) + B·sin(0) = 1,直接得到A=1 - 由
x[50]-x[49]=h,代入通解并利用三角恒等式化简,可解出B的表达式:B = [h/(2·sin(θ/2)) + sin(97θ/2)] / cos(97θ/2)
步骤3:在MuPAD中实现计算
h := 0.1; # 计算θ的值 theta := arccos(1 - h^2/2); # 确定常数A和B A := 1; B := (h/(2*sin(theta/2)) + sin(97*theta/2)) / cos(97*theta/2); # 定义通解函数 x := n -> A*cos((n-1)*theta) + B*sin((n-1)*theta); # 生成x[1]到x[50]的所有值 values := [x(n) $ n = 1..50];
两种方法得到的结果是一致的,第一种适合快速求解大规模问题,第二种能帮你理解解的数学性质。
内容的提问来源于stack exchange,提问作者Jens
相关产品推荐
相关产品推荐

