⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 robotc.c

📁 sqp程序包。用sqp算法实现非线性约束的优化求解
💻 C
📖 第 1 页 / 共 2 页
字号:
/* **************************************************************************** */
/*                                 user functions                               */
/* **************************************************************************** */
#include "o8para.h"

main() {
    void donlp2(void);
    
    donlp2();
    
    exit(0);
}
/* coded by: Hans D. Mittelmann <beck@plato.la.asu.edu> (*) */

#define XDIM    21
#define BDM     81

static DOUBLE  c11 = 2.e0, c12 =  8.e0, c13 =   25.e0;
static DOUBLE  c21 = 3.e0, c22 = 18.e0, c23 =   65.e0;
static DOUBLE  c31 = 4.e0, c32 = 50.e0, c33 =  100.e0;

static DOUBLE  vi[BDM+1][XDIM+1],vi1[BDM+1][XDIM+1],vi2[BDM+1][XDIM+1],
               v11[BDM+1],v12[BDM+1],v13[BDM+1],
               v21[BDM+1],v22[BDM+1],v23[BDM+1],
               v31[BDM+1],v32[BDM+1],v33[BDM+1];
    
static DOUBLE  bb[XDIM+1];

/* (*) translation of -, from f77 to C by S. Schoeffert, ASB, Bourges,France    */
/* **************************************************************************** */
/*                              donlp2 standard setup                           */
/* **************************************************************************** */
void setup0(void) {
    #define  X extern
    #include "o8comm.h"
    #undef   X
    
    DOUBLE th11 (DOUBLE t);
    DOUBLE th12 (DOUBLE t);
    DOUBLE th13 (DOUBLE t);
    DOUBLE th21 (DOUBLE t);
    DOUBLE th22 (DOUBLE t);
    DOUBLE th23 (DOUBLE t);
    DOUBLE th31 (DOUBLE t);
    DOUBLE th32 (DOUBLE t);
    DOUBLE th33 (DOUBLE t);
    DOUBLE phil (INTEGER i, DOUBLE t);
    DOUBLE phil1(INTEGER i, DOUBLE t);
    DOUBLE phil2(INTEGER i, DOUBLE t);

    static INTEGER i,j,m;
    static DOUBLE  xst0[XDIM+1],h,tp;

    /*              other data declaration for cases a and b                    */
    /*                                                                          */
    /* a    for (i = 1 ; i <= XDIM ; i++) xst0[i] = 1.491400623321533e0;        */
    /* b    for (i = 1 ; i <= XDIM ; i++) xst0[i] = 4.377146244049071e0;        */
    /* c    for (i = 1 ; i <= XDIM ; i++) xst0[i] = 1.920426464080810e0;        */
    /* a    static DOUBLE  c11 = 2.e0, c12 =  8.e0, c13 =  250.e0;              */
    /* a    static DOUBLE  c21 = 3.e0, c22 = 18.e0, c23 =  650.e0;              */
    /* a    static DOUBLE  c31 = 4.e0, c32 = 50.e0, c33 = 1000.e0;              */
    /* b    static DOUBLE  c11 = 1.e0, c12 =  3.e0, c13 =  100.e0;              */
    /* b    static DOUBLE  c21 = 1.e0, c22 =  3.e0, c23 =  100.e0;              */
    /* b    static DOUBLE  c31 = 1.e0, c32 =  3.e0, c33 =  100.e0;              */
    /* c    static DOUBLE  c11 = 2.e0, c12 =  8.e0, c13 =   25.e0;              */
    /* c    static DOUBLE  c21 = 3.e0, c22 = 18.e0, c23 =   65.e0;              */
    /* c    static DOUBLE  c31 = 4.e0, c32 = 50.e0, c33 =  100.e0;              */
    /* a    strcpy(name,"robota");                                              */
    /* b    strcpy(name,"robotb");                                              */

    n = XDIM;
    m = BDM;
    for (i = 1 ; i <= XDIM ; i++) {
        xst0[i] = 1.920426464080810e0;
    }
    strcpy(name,"robotc");

    nh     = 0;
    ng     = m*18;
    h      = 1.e0/(n-1);
    silent = FALSE;
    analyt = TRUE;
    epsdif = 0.e0;
    del0   = 1.e0;
    tau0   = 1.e4;
    for (j = 1 ; j <= m ; j++) {
        tp     = (DOUBLE)(j-1)/(DOUBLE)(m-1);
        v11[j] = th11(tp);
        v12[j] = th12(tp);
        v13[j] = th13(tp);
        v21[j] = th21(tp);
        v22[j] = th22(tp);
        v23[j] = th23(tp);
        v31[j] = th31(tp);
        v32[j] = th32(tp);
        v33[j] = th33(tp);
        for (i = 1 ; i <= n ; i++) {
            vi [j][i] = phil(i,tp);
            vi1[j][i] = phil1(i,tp);
            vi2[j][i] = phil2(i,tp);
        }
    }
    for (i = 1 ; i <= n ; i++) {
        x[i]  = xst0[i];
        bb[i] = h;
    }
    bb[1]   = .5e0*h;
    bb[n]   = bb[1];
    bb[2]   = 23.e0*h/24.e0;
    bb[n-1] = bb[2];
    for (j = 0 ; j <= nh+ng ; j++) {
        gunit[1][j] = -1;
        gunit[2][j] = 0;
        gunit[3][j] = 0;
    }
    return;
}

/* **************************************************************************** */
/*                                 special setup                                */
/* **************************************************************************** */
void setup(void) {
    #define  X extern
    #include "o8comm.h"
    #undef   X
    
    /* change termination criterion */
    
    epsx = 1.e-7;

    return;
}

/* **************************************************************************** */
/*  the user may add additional computations using the computed solution here   */
/* **************************************************************************** */
void solchk(void) {
    #define  X extern
    #include "o8comm.h"
    #undef   X
    #include "o8cons.h"

    return;
}

/* **************************************************************************** */
/*                               objective function                             */
/* **************************************************************************** */
void ef(DOUBLE x[],DOUBLE *fx) {
    #define  X extern
    #include "o8fuco.h"
    #undef   X

    static INTEGER i;
    
    icf = icf+1;
    *fx = 0.e0;
    for (i = 1 ; i <= n ; i++) {
        *fx = *fx+bb[i]*x[i];
    }
    return;
}

/* **************************************************************************** */
/*                          gradient of objective function                      */
/* **************************************************************************** */
void egradf(DOUBLE x[],DOUBLE gradf[]) {
    #define  X extern
    #include "o8fuco.h"
    #undef   X

    static INTEGER i;
    
    icgf = icgf+1;
    for (i = 1 ; i <= n ; i++) {
        gradf[i] = bb[i];
    }
    return;
}

/* **************************************************************************** */
/*                compute the i-th equality constaint, value is hxi             */
/* **************************************************************************** */
void eh(INTEGER i,DOUBLE x[],DOUBLE *hxi) {
    #define  X extern
    #include "o8fuco.h"
    #undef   X
    
    cres[i] = cres[i]+1;

    return;
}

/* **************************************************************************** */
/*              compute the gradient of the i-th equality constraint            */
/* **************************************************************************** */
void egradh(INTEGER i,DOUBLE x[],DOUBLE gradhi[]) {
    #define  X extern
    #include "o8fuco.h"
    #undef   X

    if ( gunit[1][i] != 1 ) cgres[i] = cgres[i]+1;
    
    return;
}

/* **************************************************************************** */
/*              compute the i-th inequality constaint, bounds included          */
/* **************************************************************************** */
void eg(INTEGER i,DOUBLE x[],DOUBLE *gxi) {
    #define  X extern
    #include "o8fuco.h"
    #undef   X
    
    static INTEGER ip,k,j;
    static DOUBLE  sum,sum1,sum2;

    if ( gunit[1][i+nh] == -1 ) cres[i+nh] = cres[i+nh]+1;
    
    ip   = (i-1)/18+1;
    k    = i-18*(ip-1);
    sum  = 0.e0;
    sum1 = 0.e0;
    sum2 = 0.e0;
    for (j = 1 ; j <= n ; j++) {
        sum  = sum +vi [ip][j]*x[j];
        sum1 = sum1+vi1[ip][j]*x[j];
        sum2 = sum2+vi2[ip][j]*x[j];
    }
    switch (k) {
    case 1:
        *gxi = c11*sum-v11[ip];
        return;
    case 2:
        *gxi = c11*sum+v11[ip];
        return;
    case 3:
        *gxi = c12*pow(sum,3)-(v12[ip]*sum-v11[ip]*sum1);
        return;
    case 4:
        *gxi = c12*pow(sum,3)+(v12[ip]*sum-v11[ip]*sum1);
        return;
    case 5:
        *gxi = c13*pow(sum,5)-(v13[ip]*pow(sum,2)-3.e0*v12[ip]*sum*sum1
               +3.e0*v11[ip]*pow(sum1,2)+v11[ip]*sum*sum2);
        return;
    case 6:
        *gxi = c13*pow(sum,5)+(v13[ip]*pow(sum,2)-3.e0*v12[ip]*sum*sum1
               +3.e0*v11[ip]*pow(sum1,2)+v11[ip]*sum*sum2);
        return;
    case 7:
        *gxi = c21*sum-v21[ip];
        return;
    case 8:
        *gxi = c21*sum+v21[ip];
        return;
    case 9:
        *gxi = c22*pow(sum,3)-(v22[ip]*sum-v21[ip]*sum1);
        return;
    case 10:
        *gxi = c22*pow(sum,3)+(v22[ip]*sum-v21[ip]*sum1);
        return;
    case 11:
        *gxi = c23*pow(sum,5)-(v23[ip]*pow(sum,2)-3.e0*v22[ip]*sum*sum1
               +3.e0*v21[ip]*pow(sum1,2)+v21[ip]*sum*sum2);
        return;
    case 12:
        *gxi = c23*pow(sum,5)+(v23[ip]*pow(sum,2)-3.e0*v22[ip]*sum*sum1
               +3.e0*v21[ip]*pow(sum1,2)+v21[ip]*sum*sum2);
        return;
    case 13:
        *gxi = c31*sum-v31[ip];
        return;
    case 14:
        *gxi = c31*sum+v31[ip];
        return;
    case 15:
        *gxi = c32*pow(sum,3)-(v32[ip]*sum-v31[ip]*sum1);
        return;
    case 16:
        *gxi = c32*pow(sum,3)+(v32[ip]*sum-v31[ip]*sum1);
        return;
    case 17:
        *gxi = c33*pow(sum,5)-(v33[ip]*pow(sum,2)-3.e0*v32[ip]*sum*sum1
               +3.e0*v31[ip]*pow(sum1,2)+v31[ip]*sum*sum2);
        return;
    case 18:
        *gxi = c33*pow(sum,5)+(v33[ip]*pow(sum,2)-3.e0*v32[ip]*sum*sum1
               +3.e0*v31[ip]*pow(sum1,2)+v31[ip]*sum*sum2);
        return;
    }
}

/* **************************************************************************** */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -