Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void Hauseholder(int n, double a[nn][nn], double c[nn], double b[nn], int vec, double v[nn][nn])
- {
- double r=0, s=0, sigma=0, tau=0, a1=0;
- if (vec == 1){
- for (int i = 0; i < n; i++){
- for (int j = 0; j < n; j++)
- if (i == j)
- v[i][j] = 1;
- else
- v[i][j] = 0;
- }
- }
- for (int k = 0; k < n - 2; k++){
- r = fabs(a[k + 1][k]);
- for (int i = k + 1; i < n; i++){
- if (r < fabs(a[i][k])){
- r = fabs(a[i][k]);
- }
- }
- if (r == 0){
- a1 = 0;
- }
- else {
- for (int i = k; i < n; i++){
- a[i][k] = a[i][k] / r;
- }
- s = 0;
- for (int i = k; i < n; i++){
- s = s + a[i][k] * a[i][k];
- }
- sigma = Signf(a[k + 1][k])*pow(s,0.5);
- a[k + 1][k] = a[k + 1][k] + sigma;
- a1 = a[k + 1][k] * sigma;
- for (int j = k; j < n; j++){
- s = 0;
- for (int i = k; i < n; i++){
- s = s + a[i][j] * a[i][k];
- }
- tau = (double)(s / a1);
- for (int i = k; i < n; i++)
- a[i][j] = a[i][j] - tau * a[i][k];
- }
- a[k][k + 1] = -r * sigma;
- for (int j = k + 1; j < n; j++){
- a[k][j] = 0;
- }
- for (int i = k; i < n; i++){
- s = 0;
- for (int j = k; j < n; j++){
- s = s + a[i][j] * a[j][k];
- }
- tau = s / a1;
- for (int j = k; j < n; j++){
- a[i][j] = a[i][j] - tau * a[j][k];
- }
- }
- }
- if (vec == 1){
- for (int i = 0; i < n; i++){
- s = 0;
- for (int j = k; j < n; j++){
- s = s + v[i][j] * a[j][k];
- }
- tau = s / a1;
- for (int j = k; j < n; j++){
- v[i][j] = v[i][j] - tau * a[j][k];
- }
- }
- }
- }
- b[0] = 0;
- for (int i = 0; i < n; i++){
- c[i] = a[i][i];
- if (i <= n - 1)
- b[i + 1] = a[i][i + 1];
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement