1 微分方程
含有导数或微分的方程称为微分方程,未知函数为一元函数的微分方程称为常微分方程。
微分方程的阶数
微分方程中导数或微分的最高阶数称为微分方程的阶数。
微分方程的解
使得微分方程成立的函数称为微分方程的解。
微分方程的特解
微分方程的不含任意常数的解称为微分方程的特解。
微分方程的通解
所含相互独立的任意常数的个数与微分方程的阶数相等的微分方程的解称为微分方程的通解。
Isaac Newton
Adams,John Couch
Le Verrier
牛顿(Isaac Newton)通过使用微分方程研究天体力学和机械力学,从理论上得到行星运动规律;英国天文学家亚当斯(Adams,John Couch)和法国天文学家勒维烈(Le Verrier)使用微分方程,找到了海王星。解微分问题的基本思想类似于解代数方程,要把问题中已知函数和未知函数之间的关系找出来,进而得到包含未知函数的一个或几个方程,然后使用分析的方法去求得未知函数的表达式。
Carl Runge
Martin Wilhelm Kutta
2 龙格-库塔法
数值分析中,龙格-库塔法(Runge-Kutta methods)是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。这些技术由数学家卡尔·龙格和马丁·威尔海姆·库塔于1900年左右发明。
龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法,其中包括著名的欧拉法,用于数值求解微分方程。由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。
3 源代码
using System;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public delegate double SDE_Equation(double x, double y);public static partial class Algorithm_Gallery{public static SDE_Equation dydx = null;/// <summary>/// Finds value of y for a given x/// using step size h and /// initial value y0 at x0./// </summary>/// <param name="x0">初值</param>/// <param name="y0">初值</param>/// <param name="x">求值点</param>/// <param name="h">步长</param>/// <returns></returns>public static double Runge_Kutta_2th_Order(double x0, double y0, double x, double h){int n = (int)((x - x0) / h);double y = y0;for (int i = 1; i <= n; i++){double k1 = h * dydx(x0, y);double k2 = h * dydx(x0 + 0.5 * h, y + 0.5 * k1);y = y + (1.0 / 6.0) * (k1 + 2 * k2);x0 = x0 + h;}return y;}}
}
4 源程序
using System;
using System.Collections;
using System.Collections.Generic;
namespace Legalsoft.Truffer.Algorithm
{
public delegate double SDE_Equation(double x, double y);
public static partial class Algorithm_Gallery
{
public static SDE_Equation dydx = null;
/// <summary>
/// Finds value of y for a given x
/// using step size h and
/// initial value y0 at x0.
/// </summary>
/// <param name="x0">初值</param>
/// <param name="y0">初值</param>
/// <param name="x">求值点</param>
/// <param name="h">步长</param>
/// <returns></returns>
public static double Runge_Kutta_2th_Order(double x0, double y0, double x, double h)
{
int n = (int)((x - x0) / h);
double y = y0;
for (int i = 1; i <= n; i++)
{
double k1 = h * dydx(x0, y);
double k2 = h * dydx(x0 + 0.5 * h, y + 0.5 * k1);
y = y + (1.0 / 6.0) * (k1 + 2 * k2);
x0 = x0 + h;
}
return y;
}
}
}