行为
错误 #452
打开解微分方程
状态:
新建
优先级:
普通
指派给:
-
开始日期:
2025-10-13
计划完成日期:
% 完成:
0%
预期时间:
#2:
描述
下面给出“一条龙”示例:
从“手写微分方程” → “Maple 符号求解” → “数值画图” → “一键生成 C++ 代码”,
全程 5 行核心命令,复制即可运行。
一、问题描述
求解二阶常微分方程(带初值)
y''(t) + 2ζω y'(t) + ω² y(t) = A cos(Ω t)
y(0)=y0, y'(0)=dy0
参数:ω=2π, ζ=0.2, A=3, Ω=π, y0=1, dy0=0。
二、Maple 符号解法(第 1~3 行)
# 1. 定义未知函数与参数
eq := diff(y(t),t,t) + 2*zeta*omega*diff(y(t),t) + omega^2*y(t) = A*cos(Omega*t);
ic := y(0)=y0, D(y)(0)=dy0;
# 2. 给参数赋值
params := omega=2*Pi, zeta=0.2, A=3, Omega=Pi, y0=1, dy0=0:
# 3. 符号求解
sol := dsolve({eq,ic} union {params}, y(t));
运行后 Maple 返回解析解:
y(t) = exp(-0.8*Pi*t)*cos(2*Pi*t*sqrt(1-0.04)) + ... (长公式略)
三、想看数值曲线?(第 4 行)
# 4. 直接画图
plots:-odeplot(rhs(sol), t=0..10, title="阻尼受迫振动");
(odeplot 也能对数值解用,同一条命令。)
四、符号解太长,只要数值?(替代方案)
# 3'. 用数值求解同一方程
sol_num := dsolve({eq,ic} union {params}, numeric, range=0..10):
plots:-odeplot(sol_num, t=0..10);
说明:
- 加
numeric选项即转数值求解(背后默认 Runge-Kutta Fehlberg 4/5)。 - 想换算法可加
method=rkf45_dae或method=rosenbrock。
五、把求得的公式一键生成 C++ 代码(第 5 行)
# 5. 生成 C++ 函数 double y(double t)
CodeGeneration[C](rhs(sol), optimize, resultname="y");
Maple 立即输出:
double y(double t) {
double t1 = exp(-0.8*M_PI*t);
double t2 = cos(2.0*M_PI*sqrt(0.96)*t);
...
return t1*(...);
}
拷贝到 VS / GCC 即可编译,和手写 C++ 性能零差别。
六、常见微分方程模板速查
| 类型 | Maple 命令 |
|---|---|
| 一阶可分离 | dsolve(diff(y(x),x)=f(x)*g(y(x)), y(x)) |
| 伯努利方程 | dsolve(diff(y(x),x)+P(x)*y(x)=Q(x)*y(x)^n, y(x)) |
| 二阶常系数齐次 | dsolve(diff(y(t),t$2)+2*delta*omega*diff(y(t),t)+omega^2*y(t)=0, y(t)) |
| 非齐次(任意右端) | 同上,右端换成 =F(t) 即可 |
| 方程组 | dsolve({diff(x(t),t)=f(x,y), diff(y(t),t)=g(x,y), ic}, numeric) |
| 刚性大系统 | dsolve(..., numeric, method=rosenbrock) |
| 边界值问题 | dsolve({ode, bcs}, numeric, method=bvp[middefer]) |
七、一句话总结
Maple 解微分方程就三步:
eq := 写出方程 + 初值
sol := dsolve(eq, y(t)) # 符号解
sol := dsolve(eq, numeric) # 数值解
再用 odeplot 看图、CodeGeneration 生成 C++,数学→产品一站式完成。
没有任何数据可供显示
行为