项目

一般

简介

行为

错误 #452

打开

解微分方程

李立奎3 个月 之前添加.

状态:
新建
优先级:
普通
指派给:
-
开始日期:
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_daemethod=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++,数学→产品一站式完成。

没有任何数据可供显示

行为

导出 Atom PDF