wartosci_wlasne.cc

/*
 * plik ma na celu prezentację podstawowych zagadnień z metod numerycznych (dla C / C++)
 *
 * prezentuje podstawowe metody poszukiwania wartości własnych macierzy
 *
 * Plik stanowi część zbióru funkcji prezentujących podstawy metod numerycznych.
 * Jako że programy te napisałem pewien czas temu nie jestem w stanie obecnie zagwarantować,
 * że działają one w pełni proprawnie. Zachęcam do zapoznania się z skryptem z metod
 * numerycznych dostępnym na stronie http://www.fuw.edu.pl/~pliszka/mn/
 *
 */
 
  
void pomnoz (double A[], double v[], double wynik[], int wymiar) {
// mnozy macierz [nxn] razy wektor [n]
  double suma;

  for (int wiersz=0; wiersz<wymiar; wiersz++) {
    suma = 0;
    for (int kolumna=0; kolumna<wymiar; kolumna++) {
      suma += A[wiersz*wymiar + kolumna] * v[kolumna];
    }
    wynik[wiersz] = suma;
  }
}

int maxww(double A[], double v[], int n, double eps, int limit, double *x) {
  double v_new[n], norma_new, norma;
  int liczba_iteracji=1, i;

  // rozklad (A - stala * Id) na gorno i dolno trojkatna -- wykorzystac program przykladowy LU

  while(true) {
    pomnoz (A, v, v_new, n);
    norma_new = 0;
    for (i=0; i<n; i++) {
      norma_new += v_new[i]*v_new[i];
    }

    norma = 0;
    for (i=0; i<n; i++) {
      v_new[i] = v_new[i] / sqrt(norma_new);
      norma += (v[i]-v_new[i])*(v[i]-v_new[i]);
    }
    if (norma > eps) {
      // sprawdzamy czy nie za dlugo
      if (liczba_iteracji++ > limit) return -1;
    } else {
      // mamy wynik !!!!
      for (i=0; i<n; i++) {
        norma = 0; // norma to teraz suma
        for (int j=0; j<n; j++) {
          norma += v_new[j] * A[j*n + i];
        }
        v[i] = norma; // v to teraz wynik mnozenia v_new^T * A
      }
      *x=0;
      for (i=0; i<n; i++)
        *x += v[i]*v_new[i];
      norma=0;
      for (i=0; i<n; i++)
        norma += v_new[i]*v_new[i]; // norma to teraz dzielnik

      *x = *x / sqrt(norma);
      return liczba_iteracji;
    }

    // jezeli nadal kontynuujemy to przygotowywujemy nastepny krok
    norma = norma_new;
    for (i=0; i<n; i++)
      v[i] = v_new[i];
  }
}

XHTML generated by highlight (http://www.andre-simon.de/) from wartosci_wlasne.cc



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license


Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.

This text/program is free document/software. Redistribution and use in source and binary forms, with or without modification, ARE PERMITTED provided save this copyright notice. This document/program is distributed WITHOUT any warranty, use at YOUR own risk.

Valid XHTML 1.1 Dokument ten (URL: http://www.opcode.eu.org/programing/c_cpp/wartosci_wlasne.cc) należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek, wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: '2014-01-07 19:27:41 (UTC)' (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).