📄 robotc.c
字号:
/* compute the gradient of the i-th inequality constraint */
/* not necessary for bounds, but constant gradients must be set */
/* here e.g. using dcopy from a data-field */
/* **************************************************************************** */
void egradg(INTEGER i,DOUBLE x[],DOUBLE gradx[]) {
#define X extern
#include "o8fuco.h"
#undef X
static INTEGER ip,k,j;
static DOUBLE sum,sum1,sum2;
if ( gunit[1][i+nh] != 1 ) cgres[i+nh] = cgres[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:
case 2:
for (j = 1 ; j <= n ; j++) {
gradx[j] = c11*vi[ip][j];
}
return;
case 3:
for (j = 1 ; j <= n ; j++) {
gradx[j] = 3.e0*c12*pow(sum,2)*vi[ip][j]-(v12[ip]*vi[ip][j]
-v11[ip]*vi1[ip][j]);
}
return;
case 4:
for (j = 1 ; j <= n ; j++) {
gradx[j] = 3.e0*c12*pow(sum,2)*vi[ip][j]+(v12[ip]*vi[ip][j]
-v11[ip]*vi1[ip][j]);
}
return;
case 5:
for (j = 1 ; j <= n ; j++) {
gradx[j] = 5.e0*c13*pow(sum,4)*vi[ip][j]-(2.e0*v13[ip]*sum*
vi[ip][j]-3.e0*v12[ip]*(sum1*vi[ip][j]+sum*vi1[ip][j])
+6.e0*v11[ip]*sum1*vi1[ip][j]+v11[ip]*
(sum2*vi[ip][j]+sum*vi2[ip][j]));
}
return;
case 6:
for (j = 1 ; j <= n ; j++) {
gradx[j] = 5.e0*c13*pow(sum,4)*vi[ip][j]+(2.e0*v13[ip]*sum*
vi[ip][j]-3.e0*v12[ip]*(sum1*vi[ip][j]+sum*vi1[ip][j])
+6.e0*v11[ip]*sum1*vi1[ip][j]+v11[ip]*
(sum2*vi[ip][j]+sum*vi2[ip][j]));
}
return;
case 7:
case 8:
for (j = 1 ; j <= n ; j++) {
gradx[j] = c21*vi[ip][j];
}
return;
case 9:
for (j = 1 ; j <= n ; j++) {
gradx[j] = 3.e0*c22*pow(sum,2)*vi[ip][j]-(v22[ip]*vi[ip][j]
-v21[ip]*vi1[ip][j]);
}
return;
case 10:
for (j = 1 ; j <= n ; j++) {
gradx[j] = 3.e0*c22*pow(sum,2)*vi[ip][j]+(v22[ip]*vi[ip][j]
-v21[ip]*vi1[ip][j]);
}
return;
case 11:
for (j = 1 ; j <= n ; j++) {
gradx[j] = 5.e0*c23*pow(sum,4)*vi[ip][j]-(2.e0*v23[ip]*sum*
vi[ip][j]-3.e0*v22[ip]*(sum1*vi[ip][j]+sum*vi1[ip][j])
+6.e0*v21[ip]*sum1*vi1[ip][j]+v21[ip]*
(sum2*vi[ip][j]+sum*vi2[ip][j]));
}
return;
case 12:
for (j = 1 ; j <= n ; j++) {
gradx[j] = 5.e0*c23*pow(sum,4)*vi[ip][j]+(2.e0*v23[ip]*sum*
vi[ip][j]-3.e0*v22[ip]*(sum1*vi[ip][j]+sum*vi1[ip][j])
+6.e0*v21[ip]*sum1*vi1[ip][j]+v21[ip]*
(sum2*vi[ip][j]+sum*vi2[ip][j]));
}
return;
case 13:
case 14:
for (j = 1 ; j <= n ; j++) {
gradx[j] = c31*vi[ip][j];
}
return;
case 15:
for (j = 1 ; j <= n ; j++) {
gradx[j] = 3.e0*c32*pow(sum,2)*vi[ip][j]-(v32[ip]*vi[ip][j]
-v31[ip]*vi1[ip][j]);
}
return;
case 16:
for (j = 1 ; j <= n ; j++) {
gradx[j] = 3.e0*c32*pow(sum,2)*vi[ip][j]+(v32[ip]*vi[ip][j]
-v31[ip]*vi1[ip][j]);
}
return;
case 17:
for (j = 1 ; j <= n ; j++) {
gradx[j] = 5.e0*c33*pow(sum,4)*vi[ip][j]-(2.e0*v33[ip]*sum*
vi[ip][j]-3.e0*v32[ip]*(sum1*vi[ip][j]+sum*vi1[ip][j])
+6.e0*v31[ip]*sum1*vi1[ip][j]+v31[ip]*
(sum2*vi[ip][j]+sum*vi2[ip][j]));
}
return;
case 18:
for (j = 1 ; j <= n ; j++) {
gradx[j] = 5.e0*c33*pow(sum,4)*vi[ip][j]+(2.e0*v33[ip]*sum*
vi[ip][j]-3.e0*v32[ip]*(sum1*vi[ip][j]+sum*vi1[ip][j])
+6.e0*v31[ip]*sum1*vi1[ip][j]+v31[ip]*
(sum2*vi[ip][j]+sum*vi2[ip][j]));
}
return;
}
}
DOUBLE f(DOUBLE t) {
return pow(t,3)*((6.e0*t-15.e0)*t+10.e0);
}
DOUBLE f1(DOUBLE t) {
return 30.e0*t*t*((t-2.e0)*t+1.e0);
}
DOUBLE f2(DOUBLE t) {
return 60.e0*t*((2.e0*t-3.e0)*t+1.e0);
}
DOUBLE f3(DOUBLE t) {
return (360.e0*t-360.e0)*t+60.e0;
}
DOUBLE th11(DOUBLE t) {
DOUBLE f1(DOUBLE t);
return 1.5e0*f1(t);
}
DOUBLE th12(DOUBLE t) {
DOUBLE f2(DOUBLE t);
return 1.5e0*f2(t);
}
DOUBLE th13(DOUBLE t) {
DOUBLE f3(DOUBLE t);
return 1.5e0*f3(t);
}
DOUBLE th21(DOUBLE t) {
DOUBLE f(DOUBLE t);
DOUBLE f1(DOUBLE t);
return -.5e0*(cos(4.7e0*f(t))*4.7e0*f1(t));
}
DOUBLE th22(DOUBLE t) {
DOUBLE f(DOUBLE t);
DOUBLE f1(DOUBLE t);
DOUBLE f2(DOUBLE t);
return -.5e0*(-sin(4.7e0*f(t))*pow(4.7e0*f1(t),2)+cos(4.7e0*f(t))*
4.7e0*f2(t));
}
DOUBLE th23(DOUBLE t) {
DOUBLE f(DOUBLE t);
DOUBLE f1(DOUBLE t);
DOUBLE f2(DOUBLE t);
DOUBLE f3(DOUBLE t);
return -.5e0*(-cos(4.7e0*f(t))*pow(4.7e0*f1(t),3)-sin(4.7e0*f(t))*
3.e0*pow(4.7e0,2)*f1(t)*f2(t)+cos(4.7e0*f(t))*f3(t)*4.7e0);
}
DOUBLE th31(DOUBLE t) {
DOUBLE f1(DOUBLE t);
return -1.3e0*f1(t);
}
DOUBLE th32(DOUBLE t) {
DOUBLE f2(DOUBLE t);
return -1.3e0*f2(t);
}
DOUBLE th33(DOUBLE t) {
DOUBLE f3(DOUBLE t);
return -1.3e0*f3(t);
}
DOUBLE phil(INTEGER i, DOUBLE t) {
#define X extern
#include "o8fuco.h"
#undef X
static DOUBLE h;
static INTEGER k;
h = 1.e0/(DOUBLE)(n-1);
k = t/h+1.e-6+1;
if ( i <= k-2 || i >= k+3 ) {
return 0.e0;
} else {
switch (k-i+3) {
case 1:
return pow(t-(DOUBLE)(k-1)*h,3)/6.e0/pow(h,3);
case 2:
return 1.e0/6.e0+(t-(DOUBLE)(k-1)*h)*.5e0/h
+pow(t-(DOUBLE)(k-1)*h,2)*.5e0/pow(h,2)
-pow(t-(DOUBLE)(k-1)*h,3)*.5e0/pow(h,3);
case 3:
return 1.e0/6.e0+((DOUBLE)(k)*h-t)*.5e0/h
+pow((DOUBLE)(k)*h-t,2)*.5e0/pow(h,2)
-pow((DOUBLE)(k)*h-t,3)*.5e0/pow(h,3);
case 4:
return pow((DOUBLE)(k)*h-t,3)/6.e0/pow(h,3);
}
}
return 0.;
}
DOUBLE phil1(INTEGER i, DOUBLE t) {
#define X extern
#include "o8fuco.h"
#undef X
static INTEGER k;
static DOUBLE h;
h = 1.e0/(DOUBLE)(n-1);
k = t/h+1.e-6+1;
if ( i <= k-2 || i >= k+3 ) {
return 0.e0;
} else {
switch (k-i+3) {
case 1:
return pow(t-(DOUBLE)(k-1)*h,2)/2.e0/pow(h,3);
case 2:
return .5e0/h+(t-(DOUBLE)(k-1)*h)/pow(h,2)
-pow(t-(DOUBLE)(k-1)*h,2)*1.5e0/pow(h,3);
case 3:
return -.5e0/h-((DOUBLE)(k)*h-t)/pow(h,2)
+pow((DOUBLE)(k)*h-t,2)*1.5e0/pow(h,3);
case 4:
return -pow((DOUBLE)(k)*h-t,2)/2.e0/pow(h,3);
}
}
return 0.;
}
DOUBLE phil2(INTEGER i, DOUBLE t) {
#define X extern
#include "o8fuco.h"
#undef X
static INTEGER k;
static DOUBLE h;
h = 1.e0/(DOUBLE)(n-1);
k = t/h+1.e-6+1;
if ( i <= k-2 || i >= k+3 ) {
return 0.e0;
} else {
switch (k-i+3) {
case 1:
return (t-(DOUBLE)(k-1)*h)/pow(h,3);
case 2:
return 1.e0/pow(h,2)-(t-(DOUBLE)(k-1)*h)*3.e0/pow(h,3);
case 3:
return 1.e0/pow(h,2)-((DOUBLE)(k)*h-t)*3.e0/pow(h,3);
case 4:
return ((DOUBLE)(k)*h-t)/pow(h,3);
}
}
return 0.;
}
/* **************************************************************************** */
/* user functions (if bloc == TRUE) */
/* **************************************************************************** */
void eval_extern(INTEGER mode) {
#define X extern
#include "o8comm.h"
#include "o8fint.h"
#undef X
#include "o8cons.h"
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -