gsl gnu求解一阶常微分方程

时间:2016-12-03 15:53:53

标签: ode gsl differential-equations

我访问了gnu gsl网站,我没有找到那里的例子来解决微分方程直观(特别是因为它使用的是二阶微分方程)。 https://www.gnu.org/software/gsl/manual/html_node/ODE-Example-programs.html#ODE-Example-programs 有人可以指导在哪里找到解决非常简单的一阶差分方程的描述性指南。

例如,supoose我的函数是y'= x + 2y(或任何这样的函数)然后如何在gsl中编写代码以使用给定的固定步长和初始条件来解决它。

1 个答案:

答案 0 :(得分:2)

对于y'=f(x,y)=x+2y,数组的所有维度都是1,这通常是要避免的,但这里它是指导性的。对于显式求解器,即名称中不包含imp的求解器,您不需要Jacobian:

#include <stdio.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_odeiv2.h>

int odefunc (double x, const double y[], double f[], void *params)
{
    f[0] = x+2*y[0];   
    return GSL_SUCCESS;
}


int * jac;

int main ()
{
    int dim = 1;
    gsl_odeiv2_system sys = {odefunc, NULL, dim, NULL};

    gsl_odeiv2_driver * d = gsl_odeiv2_driver_alloc_y_new (&sys, gsl_odeiv2_step_rkf45, 1e-6, 1e-6, 0.0);
    int i;
    double x0 = 0.0,  xf = 100.0; /* start and end of integration interval */
    double x = x0;
    double y[1] = { 1.0  };  /* initial value */

    for (i = 1; i <= 100; i++)
    {
        double xi = x0 + i * (xf-x0) / 100.0;
        int status = gsl_odeiv2_driver_apply (d, &x, xi, y);

        if (status != GSL_SUCCESS)
        {
            printf ("error, return value=%d\n", status);
            break;
        }

        printf ("%.8e %.8e\n", x, y[0]);
    }

    gsl_odeiv2_driver_free (d);
    return 0;
}

你可能想查阅一本书&#34;使用C和开源工具进行计算建模的简介&#34; 由Jose M. Garrido撰写。