PICME
OBMEP - CNPq
Algoritmo GCMRC Gradiente Conjugado Modificado com Região de Confi-ança
//Implementado por Lucas Frank Hollmann como parte do projeto PICME orientado por Paulo Conejo
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> double Cdouble(char *s) {
int i, mult = 1, dec=0, k=0, neg = 0, j, lul; double val=0, lult = 0.1;
char h[100], l[100]; memset(h, 0, 100); memset(l, 0, 100); j=0; for(i=0;i<strlen(s);i++) { if(s[i] == ’-’) { neg = 1; i++; } if(s[i]==’,’) { dec = 1; i++; } if(dec)
{ l[k] = s[i]; k++; } else { h[j] = s[i]; j++; } } //printf("h %s\n", h); //printf("l %s\n", l); for(i=strlen(h)-1;i>=0;i--) { h[i] -= 48; val += h[i]*mult; mult = mult*10; } for(i=0;i<strlen(l);i++) { lul = l[i] - 48; val += lul*lult; lult = lult/10; //printf("%lf\n", lult); //printf("%lf\n", val); } //printf("%lf\n \n", val); if(neg) { val = val*-1; } return val; } char *Cchar(double d) {
int dneg=0, jota; if(d<0) { dneg = 1; d = -1*d; } int i, y, j=0;
double low, high, x, ife=0; char s[100], *s1; s1 = malloc(100*sizeof *s1); high = (int)d; low = d - high; low = low*1000000; //printf("dd %lf\n \n", d); i=0; if(low) { for(jota=1;jota<=6;jota++) { x = (int)low%10; low = low/10; y*=10; ife = 1; s[i] = (int)x+48; i++; } } if(ife) { s[i]=’,’; i++; } y = 10; int first=1; while((int)high || first)
{ first=0; x = (int)highhigh -= x; x = x/y*10; y = y*10; s[i] = (int)x+48; i++; } s[i] = 0; j=strlen(s)-1; if(dneg) { s1[0] = ’-’; for(i=1;i<=strlen(s);i++) { s1[i] = s[j]; j--; } } else { for(i=0;i<strlen(s);i++) { s1[i] = s[j]; j--; } } //printf("string %s\n", s1); return s1; }
double Rfunction(char *fu, double *x) {
int i, j, k, w, cont, ii, jj, xx, menosvar, notfirst=0, kkk, l, li, ROCKET; double a, oper, oper2;
strcpy(f,fu);
//printf("ffffffffffff %s\n", f);
//printf("%s\n", f);
//substitui os números nas variáveis { j=0; for(i=0;i<strlen(f);i++) { kkk=i-2; aux[j] = f[i]; j++; if(f[i] == ’x’) { menosvar = 0; if(i>0) { if(f[i-1]==’-’) { menosvar = 1; //printf("%c\n", f[i-1]); } } k=0; i++; while(f[i] >= 48 f[i] <= 57) {
num[k] = f[i]; //printf("%c\n", num[k]); i++; k++; } num[k]=0; //printf("num %s\n", num); xx = Cdouble(num); //printf("x[xx] %d\n", xx); if(menosvar) { x[xx-1]*=-1; } //printf("x[xx] %lf\n", x[xx-1]); strcpy(num, Cchar(x[xx-1])); //printf("a\n"); //printf("num %s\n", num); j--; if(menosvar) { aux[j-1]=’+’; //printf("j %d\n", j-1); }
else if(menosvar (notfirst || f[kkk] == ’(’)) { j--; } /*else if(menosvar) { aux[j-1]=’+’; //printf("j %d\n", j-1); }*/ for(k=0;k<strlen(num);k++) { aux[j] = num[k]; j++; //printf("aassfdss %d\n", j);
} i--; //printf("fff %s\n", aux); memset(num, 0, 1000); notfirst = 1; if(menosvar) { x[xx-1]*=-1; } } } aux[j] = 0; //printf("aux %s\n", aux); strcpy(f, aux); //printf("ffffffffffff %s\n", f); memset(aux, 0, 1000); j=0; } //printf("%s\n", f); //printf("%s\n", f);
//resolve o que está entre parênteses { w=0; for(i=0;i<strlen(f);i++) { aux[w] = f[i]; w++; if(f[i] == ’(’) { cont = 1; ii = i; i++; while(cont) { if(f[i] == ’(’) {
cont++; } if(f[i] == ’)’) { cont--; } i++; } i--; jj = i; k=0; for(j=ii+1;j<=jj;j++) { if(j==jj) { new[k] = 0; } else { new[k++] = f[j]; } if(j==jj) { a = Rfunction(new, x); } } strcpy(num, Cchar(a)); w--; for(k=0;k<strlen(num);k++) { aux[w] = num[k]; w++; //printf("aassfdss %d\n", j); } } }
w++; aux[w] = 0; strcpy(f, aux); }
//printf("ffffffffffff %s\n", f);
//resolve as funções trigonométricas, logarítmicas e raízes { memset(aux, 0, 1000); memset(num, 0, 1000); l=0; for(i=0;i<strlen(f);i++) { aux[l]=f[i]; l++; //cosseno
if(f[i]==’c’ f[i+1]==’o’ f[i+2]==’s’) { k=i+3; j=0; while(f[k]==’-’ || f[k]==’,’ || (f[k]>=48 f[k]<=57)) { num[j] = f[k]; k++; j++; } i = k-1; //printf("num1 %s\n", num); oper = Cdouble(num); oper = oper*0.017453278; //printf("oper %lf\n", oper); memset(num, 0, 1000); oper = cos(oper); //printf("oper2 %lf\n", oper);
strcpy(num,Cchar(oper)); //printf("num %s\n", num); l--; for(j=0;j<strlen(num);j++) { aux[l] = num[j]; l++; } memset(num, 0, 1000); } //seno
if(f[i]==’s’ f[i+1]==’e’ f[i+2]==’n’) { k=i+3; j=0; while(f[k]==’-’ || f[k]==’,’ || (f[k]>=48 f[k]<=57)) { num[j] = f[k]; k++; j++; } i = k-1; //printf("num1 %s\n", num); oper = Cdouble(num); oper = oper*0.017453278; //printf("oper %lf\n", oper); memset(num, 0, 1000); oper = sin(oper); //printf("oper2 %lf\n", oper); strcpy(num,Cchar(oper)); //printf("num %s\n", num); l--; for(j=0;j<strlen(num);j++) {
aux[l] = num[j]; l++; } memset(num, 0, 1000); } //tangente if(f[i]==’t’ f[i+1]==’g’) { k=i+2; j=0; while(f[k]==’-’ || f[k]==’,’ || (f[k]>=48 f[k]<=57)) { num[j] = f[k]; k++; j++; } i = k-1; //printf("num1 %s\n", num); oper = Cdouble(num); oper = oper*0.017453278; //printf("oper %lf\n", oper); memset(num, 0, 1000); oper = tan(oper); //printf("oper2 %lf\n", oper); strcpy(num,Cchar(oper)); //printf("num %s\n", num); l--; for(j=0;j<strlen(num);j++) { aux[l] = num[j]; l++; } memset(num, 0, 1000);
}
//logaritmo natural
if(f[i]==’l’ f[i+1]==’o’ f[i+2]==’g’ f[i+3]==’n’) { k=i+4; j=0; //printf("cccc %c\n", f[k]); while(f[k]==’-’ || f[k]==’,’ || (f[k]>=48 f[k]<=57)) { num[j] = f[k]; k++; j++; } i = k-1; //printf("num1 %s\n", num); oper = Cdouble(num); //oper = oper*0.017453278; //printf("oper %lf\n", oper); memset(num, 0, 1000); oper = log(oper); //printf("oper2 %lf\n", oper); strcpy(num,Cchar(oper)); //printf("num %s\n", num); l--; for(j=0;j<strlen(num);j++) { aux[l] = num[j]; l++; } memset(num, 0, 1000); }
//logaritmo com base 10
if(f[i]==’l’ f[i+1]==’o’ f[i+2]==’g’) {
k=i+3; j=0; while(f[k]==’-’ || f[k]==’,’ || (f[k]>=48 f[k]<=57)) { num[j] = f[k]; k++; j++; } i = k-1; //printf("num1 %s\n", num); oper = Cdouble(num); //oper = oper*0.017453278; //printf("oper %lf\n", oper); memset(num, 0, 1000); oper = log10(oper); //printf("oper2 %lf\n", oper); strcpy(num,Cchar(oper)); //printf("num %s\n", num); l--; for(j=0;j<strlen(num);j++) { aux[l] = num[j]; l++; } memset(num, 0, 1000); }
//raiz com qualquer índice
if(f[i]==’r’ f[i+1]==’a’ f[i+2]==’i’ f[i+3]==’z’ f[i+4]==’’) {
k=i+5; j=0;
while(f[k]==’-’ || f[k]==’,’ || (f[k]>=48 f[k]<=57)) { num[j] = f[k]; k++; j++; } num[k]=0; if(f[k]==’;’) { k++; j=0; while(f[k]==’-’ || f[k]==’,’ || (f[k]>=48 f[k]<=57)) { new[j] = f[k]; k++; j++; } new[j]=0; } i = k-1; //printf("num1 %s\n", new); oper = Cdouble(num); oper2 = Cdouble(new); //printf("oper %lf\n", oper2); oper2 = 1/oper2; //oper = oper*0.017453278; //printf("oper %lf\n", oper2); memset(num, 0, 1000); memset(new, 0, 1000); oper = pow(oper,oper2); //printf("oper2 %lf\n", oper); strcpy(num,Cchar(oper)); //printf("num %s\n", num); l--; for(j=0;j<strlen(num);j++) { aux[l] = num[j]; l++;
} memset(num, 0, 1000); memset(new, 0, 1000); i++; } } strcpy(f,aux); //printf("ff:: %s\n", f); } //resolve potências { memset(aux, 0, 1000); memset(num, 0, 1000); memset(new, 0, 1000); l=0; for(i=0;i<strlen(f);i++) { aux[l]=f[i]; l++; if(f[i]==’ˆ’) { k=i+1; j=0; while((f[k]==’-’ k==(i+1))|| f[k]==’,’ || (f[k]>=48 f[k]<=57)) { num[j] = f[k]; k++; j++; } li=i;
i=k; k=li-1; j=0; l--; while(f[k]==’-’ || f[k]==’,’ || (f[k]>=48 f[k]<=57)) { new[j] = f[k]; aux[l] = 0; k--; l--; j++; if(f[k]==’-’) break; } //printf("num %s\n", num); //printf("new %s\n", new); l=k+1; oper2 = Cdouble(num); memset(num, 0, 1000); li = strlen(new)-1; for(j=0;j<strlen(new);j++) { num[j] = new[li]; li--; } //printf("num %s\n", num); oper = Cdouble(num); //printf("oper %lf\n", oper); oper = pow(oper,oper2); memset(num, 0, 1000); strcpy(num, Cchar(oper)); //printf("num %s\n", num); for(j=0;j<strlen(num);j++) { aux[l] = num[j]; l++;
} //printf("aux %s\n", aux); //i--; for(i=i;i<strlen(f);i++) { //printf("aaaaaaaaaaaaaa\n"); aux[l]=f[i]; l++; } i=-1; strcpy(f,aux); memset(aux, 0, 1000); memset(num, 0, 1000); memset(new, 0, 1000); l=0; //printf("fff-> %s\n", f); } } //printf("aux %s\n", aux); //strcpy(f,aux); } //resolve multiplicação { memset(aux, 0, 1000); memset(num, 0, 1000); memset(new, 0, 1000); l=0; for(i=0;i<strlen(f);i++) { aux[l]=f[i]; l++; //printf("aux-> %s\n", aux); if(f[i]==’*’) {
k=i+1; j=0; while((f[k]==’-’ k==(i+1))|| f[k]==’,’ || (f[k]>=48 f[k]<=57)) { num[j] = f[k]; k++; j++; } li=i; i=k; k=li-1; j=0; l--; while(f[k]==’-’ || f[k]==’,’ || (f[k]>=48 f[k]<=57)) { new[j] = f[k]; aux[l] = 0; k--; l--; j++; if(f[k]==’-’) break; } //printf("num %s\n", num); //printf("new %s\n", new); l=k+1; oper2 = Cdouble(num); memset(num, 0, 1000); li = strlen(new)-1; for(j=0;j<strlen(new);j++) { num[j] = new[li]; li--; } //printf("num %s\n", num); oper = Cdouble(num);
oper = oper*oper2; memset(num, 0, 1000); strcpy(num, Cchar(oper)); //printf("oper %lf\n", oper); //printf("num %s\n", num); for(j=0;j<strlen(num);j++) { aux[l] = num[j]; l++; } //printf("aux %s\n", aux); for(i=i;i<strlen(f);i++) { //printf("aaaaaaaaaaaaaa\n"); aux[l]=f[i]; l++; } i=-1; strcpy(f,aux); memset(aux, 0, 1000); memset(num, 0, 1000); memset(new, 0, 1000); l=0; //printf("fff*-> %s\n", f); } } //printf("aux %s\n", aux); //strcpy(f,aux); } //resolve divisões { memset(aux, 0, 1000); memset(num, 0, 1000); memset(new, 0, 1000); l=0;
for(i=0;i<strlen(f);i++) { aux[l]=f[i]; l++; if(f[i]==’/’) { k=i+1; j=0; while((f[k]==’-’ k==(i+1))|| f[k]==’,’ || (f[k]>=48 f[k]<=57)) { num[j] = f[k]; k++; j++; } li=i; i=k; k=li-1; j=0; l--; while(f[k]==’-’ || f[k]==’,’ || (f[k]>=48 f[k]<=57)) { new[j] = f[k]; aux[l] = 0; k--; l--; j++; if(f[k]==’-’) break; } //printf("num %s\n", num); //printf("new %s\n", new); l=k+1; oper2 = Cdouble(num); memset(num, 0, 1000); li = strlen(new)-1; for(j=0;j<strlen(new);j++) {
num[j] = new[li]; li--; } //printf("num %s\n", num); oper = Cdouble(num); oper = oper/oper2; memset(num, 0, 1000); strcpy(num, Cchar(oper)); //printf("oper %lf\n", oper); //printf("num %s\n", num); for(j=0;j<strlen(num);j++) { aux[l] = num[j]; l++; } //printf("aux %s\n", aux); //i--; for(i=i;i<strlen(f);i++) { //printf("aaaaaaaaaaaaaa\n"); aux[l]=f[i]; l++; } i=-1; strcpy(f,aux); memset(aux, 0, 1000); memset(num, 0, 1000); memset(new, 0, 1000); l=0; //printf("fff-> %s\n", f); } } //printf("aux %s\n", aux); //strcpy(f,aux); }
//resolve somas { memset(aux, 0, 1000); memset(num, 0, 1000); memset(new, 0, 1000); l=0; for(i=0;i<strlen(f);i++) { aux[l]=f[i]; l++; if(f[i]==’+’) { k=i+1; j=0; while((f[k]==’-’ k==(i+1))|| f[k]==’,’ || (f[k]>=48 f[k]<=57)) { num[j] = f[k]; k++; j++; } li=i; i=k; k=li-1; j=0; l--; ROCKET=0; while(f[k]==’-’ || f[k]==’,’ || (f[k]>=48 f[k]<=57)) { new[j] = f[k]; aux[l] = 0; k--; l--; j++; if(f[k+1]==’-’) { // printf("xD\n");
if((k+1)!=0) { ROCKET=1; } break; } } //printf("num %s\n", num); //printf("new %s\n", new); l=k+1; oper2 = Cdouble(num); //printf("oper2 %lf\n", oper2); memset(num, 0, 1000); li = strlen(new)-1; for(j=0;j<strlen(new);j++) { num[j] = new[li]; li--; } //printf("num %s\n", num); oper = Cdouble(num); oper = oper+oper2; if(oper<0) { ROCKET=0; } memset(num, 0, 1000); strcpy(num, Cchar(oper)); //printf("oper %lf\n", oper); //printf("num %s\n", num); if(ROCKET) { aux[l]=’+’; l++; }
for(j=0;j<strlen(num);j++) { aux[l] = num[j]; l++; } //printf("aux %s\n", aux); //i--; for(i=i;i<strlen(f);i++) { //printf("aaaaaaaaaaaaaa\n"); aux[l]=f[i]; l++; } i=-1; strcpy(f,aux); memset(aux, 0, 1000); memset(num, 0, 1000); memset(new, 0, 1000); l=0; //printf("fff +-> %s\n", f); } } //printf("aux %s\n", aux); //strcpy(f,aux); } //resolve subtrações { memset(aux, 0, 1000); memset(num, 0, 1000); memset(new, 0, 1000); l=0; for(i=0;i<strlen(f);i++) { aux[l]=f[i]; l++;
if(f[i]==’-’ i!=0) { k=i+1; j=0; while((f[k]==’-’ k==(i+1)) || f[k]==’,’ || (f[k]>=48 f[k]<=57)) { num[j] = f[k]; k++; j++; } li=i; i=k; k=li-1; j=0; l--; while(f[k]==’-’ || f[k]==’,’ || (f[k]>=48 f[k]<=57)) { new[j] = f[k]; aux[l] = 0; k--; l--; j++; if(f[k+1]==’-’) { break; } } //printf("num %s\n", num); //printf("new %s\n", new); l=k+1; oper2 = Cdouble(num); //printf("oper2 %lf\n", oper2); memset(num, 0, 1000); li = strlen(new)-1; for(j=0;j<strlen(new);j++) { num[j] = new[li]; li--;
} //printf("num %s\n", num); oper = Cdouble(num); oper = oper-oper2; memset(num, 0, 1000); strcpy(num, Cchar(oper)); //printf("oper %lf\n", oper); //printf("num2 %s\n", num); for(j=0;j<strlen(num);j++) { aux[l] = num[j]; l++; } //printf("aux %s\n", aux); //i--; for(i=i;i<strlen(f);i++) { //printf("aaaaaaaaaaaaaa\n"); aux[l]=f[i]; l++; } i=-1; strcpy(f,aux); memset(aux, 0, 1000); memset(num, 0, 1000); l=0; //printf("fff-> %s\n", f); } } //printf("aux %s\n", aux); //strcpy(f,aux); } //printf("ff %s\n", f); a = Cdouble(f);
return a; }
int ndim;
double *MGC(double n, double regconf, double e, double **a, double yi[]) {
int i, j,jj;
double *x0, *gradiente, *d0, beta, *da, dad, pd, tal, dn, xn, *xa, *r, z, z1, alpha; x0 = malloc(1000 * sizeof *x0);
gradiente = malloc(1000 * sizeof *gradiente); d0 = malloc(1000 * sizeof *d0);
da = malloc(1000 * sizeof *da); xa = malloc(1000 * sizeof *xa); r = malloc(1000 * sizeof *r); for(i=0;i<n;i++)//x0 = 0,0,0,... { x0[i]=0; } z = 0; for(i=0;i<n;i++)//r0 = -gc d0 = r0 z = r*r { r[i] = -1*yi[i]; //printf("r1: %lf\n", r[i]); d0[i] = r[i]; z+=r[i]*r[i]; } //início da repetição for(jj=0;jj<n;jj++) { for(i=0;i<n;i++) //dA { da[i]=0; for(j=0;j<n;j++) { da[i] += a[j][i]*d0[j];
} } dad = 0; for(i=0;i<n;i++) //dAd { dad += da[i]*d0[i]; } //printf("dad: %lf\n", dad); if(dad <= 0) { tal = 0; dn=0; pd=0; for(i=0;i<n;i++) { pd+=x0[i]*d0[i]; } xn=0; for(i=0;i<n;i++) { xn+=x0[i]*x0[i]; } for(i=0;i<n;i++) { dn+=d0[i]*d0[i]; } tal = (-2*pd+sqrt(4*pd*pd-4*(xn-regconf*regconf)*dn))/(2*dn); for(i=0;i<n;i++) {
x0[i] = x0[i] + tal*d0[i]; }
return x0; } alpha = z/dad; xn = 0; for(i=0;i<n;i++) //xk+1 = xk + d0*alpha {
xa[i] = x0[i] + alpha*d0[i]; xn+=xa[i]*xa[i];
//printf("x1: %lf\n", xa[i]); }
//printf("xn: %lf\n", xn); xn = sqrt(xn);
if(xn > regconf) // ponto fora da região de confiança { tal = 0; dn=0; pd=0; for(i=0;i<n;i++) { pd+=x0[i]*d0[i]; } xn=0; for(i=0;i<n;i++) { xn+=x0[i]*x0[i]; } for(i=0;i<n;i++) { dn+=d0[i]*d0[i]; } tal = (-2*pd+sqrt(4*pd*pd-4*(xn-regconf*regconf)*dn))/(2*dn);
for(i=0;i<n;i++) {
x0[i] = x0[i] + tal*d0[i]; }
return x0; }
z1=0;
for(i=0;i<n;i++) //ri+1 = ri - alpha*da || z1 = r1*r1 {
r[i] = r[i] - alpha*da[i]; z1 += r[i]*r[i]; } if(sqrt(z1) < e) { return xa; } beta = z1/z; for(i=0;i<n;i++) {
d0[i] = r[i] + beta*d0[i]; x0[i] = xa[i]; } z = z1; } return x0; }
double **a, b[1000], *p, somgrad=1, ared, pred, b1[1000], mk[1000], mk1, grads[1000], RC=2, g0, iter=0;
int k;
int i, j;
double **makemat(double **a, double *xis) { int i, j, k=0; /*for(i=0;i<ndim;i++) { for(j=0;j<ndim;j++) { //printf("s: %s\n", fun[k]); //a[i][j] = Rfunction(fun[k],xis); //printf("%lf ", a[i][j]);
//printf("jj %lf %lf\n", xis[0] ,xis[1]); //k++; } printf("\n"); }*/ a[0][0] = 2-400*b[1]+1200*b[0]*b[0]; a[0][1] = -400*xis[0]; a[1][0] = -400*xis[0]; a[1][1] = 200; return a; } int main() { ndim=2;
//aloca dinamicamente a matriz A e o vetor p; a = malloc(50 * sizeof *a);
p = malloc(1000 * sizeof *p); for(i=0;i<1000;i++)
{
a[i] = malloc(50 * sizeof *a[i]); }
//início
/*printf("Dimensão do problema: "); scanf("%d", ndim);
printf("Função a ser minimizada: "); scanf("%s", func); */ printf("Vetor X0:\n"); for(j=0;j<ndim;j++)//scanf vetor b { scanf("%lf", b[j]); } /* printf("Gradiente da função:\n"); for(j=0;j<ndim;j++) { scanf("%s", grad[j]); } //for(j=0;j<ndim;j++) //{ // printf("%lf ", p[j]); //} printf("Hessiana da função:\n"); for(j=0;j<ndim*ndim;j++) { scanf("%s", fun[j]); }*/ grads[0] = -400*b[0]*(b[1]-(b[0]*b[0]))-2*(1-b[0]); grads[1] = 200*(b[1]-(b[0]*b[0])); somgrad = 0; for(j=0;j<ndim;j++) { /*grads[j] = Rfunction(grad[j], b); printf("grad %d %lf\n", j+1 ,grads[j]);*/ somgrad=somgrad + (grads[j]*grads[j]); } //printf("Valor de f(x): %lf\n", Rfunction(func, b));
somgrad = sqrt(somgrad); //tomar ared g0 = somgrad; while(somgrad>0.000001) { a=makemat(a, b); p=MGC(ndim, RC, 0.1, a, grads); /*printf("Ponto p: "); for(j=0;j<ndim;j++) { printf("%.2lf ", p[j]); } printf("\n");*/ //ared = Rfunction(func, b); //printf("ared0 %lf\n", ared); for(j=0;j<ndim;j++) { b1[j] = b[j]+p[j]; }
//ared = ared - Rfunction(func,b1);
ared = 100*(b[1]-(b[0]*b[0]))*(b[1]-(b[0]*b[0]))+(1-b[0])*(1-b[0]); ared = ared - 100*(b1[1]-(b1[0]*b1[0]))*(b1[1]-(b1[0]*b1[0]))+(1-b1[0])*(1-b1[0]); //printf("b1 %lf\n", Rfunction(func,b1)); //=================================================================================================// mk1=0; for(j=0;j<ndim;j++) { mk[j] = 0; for(k=0;k<ndim;k++) { mk[j]+=a[j][k]*p[k]; } mk1+=mk[j]*p[j]/* + grads[j]*p[j]*/; } mk1=mk1/2; for(j=0;j<ndim;j++) {
mk1+=grads[j]*p[j]; } mk1=-1*mk1; //pred //printf("ared %lf\n", ared); //printf("pred %lf\n", mk1); if(ared > 0.2*mk1) { //printf("xD\n"); for(j=0;j<ndim;j++) { b[j] = b1[j]; } RC=RC*2; } else { RC=RC*0.5; } somgrad = 0; /*printf("Ponto de mínimo: "); for(j=0;j<ndim;j++) { printf("%.2lf ", b[j]); } printf("\n");*/ grads[0] = -400*b[0]*(b[1]-(b[0]*b[0]))-2*(1-b[0]); grads[1] = 200*(b[1]-(b[0]*b[0])); for(j=0;j<ndim;j++) { /*grads[j] = Rfunction(grad[j], b);
printf("jj %lf %lf\n", grads[0] ,grads[1]);*/ somgrad=somgrad + (grads[j]*grads[j]);
printf("Valor de f(x): %lf\n", 100*(b[1]-(b[0]*b[0]))*(b[1]-(b[0]*b[0]))+(1-b[0])*(1-b[0])); //memset(b1, 0, 1000); iter++; } printf("Ponto de mínimo: "); for(j=0;j<ndim;j++) { printf("%.2lf ", b[j]); } printf("\n"); printf("Valor minimo de f(x): %lf\n", 100*(b[1]-(b[0]*b[0]))*(b[1]-(b[0]*b[0]))+(1-b[0])*(1-b[0]));
printf("Numero de iteracoes: %.0lf\n", iter);
return 0; }