I guess it could be something like this in C
#include <math.h>
double dot(int sz, double *u, double* v){
int i;
double res = 0.0;
for(i = 0; i < sz; ++i)
res += u[i] * v[i];
return res;
}
void cumul(int sz, double *u, double* res){
int i;
for(i = 0; i < sz; ++i)
res[i] += u[i];
}
double norm2(int sz, double *u){
return sqrt(dot(sz, u, u));
}
void prod(int sz, double **A, double *v, double *res){
int i;
for(i = 0; i < sz; ++i)
res[i] = dot(sz, A[i], v);
}
void zoom(int sz, double *y, double fact, double *res){
int i;
for(i = 0; i < sz; ++i){
res[i] = y[i] * fact;
}
}
void PowerMethod(int sz, double **A, double* y, double e, int *t, double *v){
int stop = 0;
while(1){
zoom(sz, y, 1.0/norm2(sz, y), v);
prod(sz, A, v, y);
*t = dot(sz, v, y);
if(stop)
return;
zoom(sz, v, -*t, v);
cumul(sz, y, v);
if(norm2(sz, v) <= e * abs(*t))
stop = 1;
}
} I don't have many opportunities to code C, so you can certainly improve it :)
Edit: you still need to write the main function and allocate and initialize a few arrays of double ...
Gribouillis
Posting Maven
Moderator
2,786 posts since Jul 2008
Reputation Points: 1,044
Solved Threads: 691