Demo entry 6516379

Eksamen

   

Submitted by Marcus on May 31, 2017 at 08:15
Language: C++. Code size: 18.4 kB.

//============================================================================
// Name        : EKSAMEN.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <iomanip>
#include <math.h>
#include <fstream>
#define Nmax 12


void IndtastVektor(double v[Nmax], int n);
void IndtastAogn(double A[Nmax][Nmax], int &n);
void IndlaesFraFilAogn(double A[Nmax][Nmax], int &n);
void NormVektor(double v[Nmax],double vNorm[Nmax],double &L, int n);
void MultMatrixVektor(double K[Nmax][Nmax], double v[Nmax], double vprod[Nmax], int n);
void UdskrivMatrix(double M[Nmax][Nmax], int n);
void MatrixGangeMatrix(double A[Nmax][Nmax], double M1[Nmax][Nmax],double M2[Nmax][Nmax], int n);
void Ac(double A[Nmax][Nmax],double An[Nmax][Nmax],double lamn[Nmax],int &n);
void NormMatrix(double M[Nmax][Nmax], int n);
void Spektral(double A[Nmax][Nmax], double An[Nmax][Nmax],double lamn[Nmax],int n);
double DanMaxAbsDif(double M1[Nmax][Nmax], double M2[Nmax][Nmax], int n);
void DanBilledMatrix(double Kn[Nmax][Nmax], int &n);
void UdskrivBilledMatrix(double Kn[Nmax][Nmax], int n);
void SorterNormer(double LamValsUs[Nmax], double WMatUs[Nmax][Nmax], double LamValsSo[Nmax], double VMatSo[Nmax][Nmax], int n);
void Sort(double v[Nmax], int left, int right, int indexs[Nmax]);
void DanU1D1V1(double LamValsSo[Nmax], double VMatSo[Nmax][Nmax], double U1[Nmax][Nmax], double D1[Nmax], double V1[Nmax][Nmax], int n);
void VecOutput(double v[Nmax], int n);
void Rk(double a[Nmax], double b[Nmax-1], double c[Nmax-1], double s[Nmax-1], int n);
void Ak(double a[Nmax], double b[Nmax-1], double c[Nmax-1], double s[Nmax-1], int n);
void UpdateQonIterk(double Q[Nmax][Nmax], double c[Nmax-1], double s[Nmax-1], int n);
double MaxNum(double b[Nmax], int n);
void QR(double AK[Nmax][Nmax],double Q[Nmax][Nmax],double Q0[Nmax][Nmax],double a[Nmax],int n);
double IndreProdukt(double v1[Nmax],double v2[Nmax],int n);
void TriDiagonalisering(double A[Nmax][Nmax], double AK[Nmax][Nmax], double Q0[Nmax][Nmax], int n);
void svd(double A[Nmax][Nmax], double D1[Nmax], double V1[Nmax][Nmax], double U1[Nmax][Nmax], int n);

void Intro(char &Valgabcd);
void Del2(char &Valg12);
void A1(double A[Nmax][Nmax], int &n);
void B1(double A[Nmax][Nmax], int &n);
void C1(double A[Nmax][Nmax],double An[Nmax][Nmax],double lamn[Nmax],int &n);
void DI1(double Kn[Nmax][Nmax], int &n);

void MatrixGangeMatrix2(double A[Nmax][Nmax], double M1[Nmax][Nmax],double M2[Nmax][Nmax], int n, int r,int l);
void MatrixGangeDia(double A[Nmax][Nmax], double M1[Nmax][Nmax],double M2[Nmax], int n, int r);
void UdskrivNulrumMatrix(double M[Nmax][Nmax], int n, int r);
void UdskrivIkkeMatrix(double M[Nmax][Nmax], int n, int r);

using namespace std;

int main() {
	int n;

double A[Nmax][Nmax],An[Nmax][Nmax],lamn[Nmax], Q[Nmax][Nmax], a[Nmax];
double Q0[Nmax][Nmax];
double AK[Nmax][Nmax];
double D1[Nmax],V1[Nmax][Nmax], U1[Nmax][Nmax];
char Valgabcd, Valg12, ValgIgen;

do{
	Intro(Valgabcd);
	switch(Valgabcd){
		case 'A': case 'a':
			A1(A,n);
			break;
		case 'B': case 'b':
			B1(A,n);
			break;
		case 'C': case 'c':
			C1(A,An,lamn,n);
			break;
		case 'D': case 'd':
			DI1(A,n);
			break;
		default:
			cout<<"Du har indtastet en ikke godkendt variabel";
	}
	Del2(Valg12);
	if(Valg12=='1'){
		TriDiagonalisering(A,AK,Q0,n);
		UdskrivMatrix(AK,n);
		QR(AK,Q,Q0,a,n);
	}
	else{
		svd(A,D1,V1,U1,n);
	}
	cout<<"\n\nØnsker du at køre igen? Indtast j for at køre igen og n for at stoppe. Indtast nu: ";
	cin>>ValgIgen;
}while(ValgIgen=='j'||ValgIgen=='J');


	return 0;
}
void IndtastAogn(double A[Nmax][Nmax], int &n){
	char ValGemA;
		cout<<"\nIndtast n: ";
		cin>>n;
		cout<<"\nIndast din matrice: "<<endl;
		for (int i=0;i<n;i=i+1){
			for (int j=0;j<n;j=j+1){
					cout<<"Indtast element "<<"["<<i+1<<" "<<j+1<<"]"<<" :";
					cin>>A[i][j];
			}
		}

		cout<<"\nVil du udskrive A og n til fil? Svar J/N";
		cin>>ValGemA;

		if (ValGemA=='j'|| ValGemA=='J'){
			cout<<"\nDu har valgt at gemme til fil"<<endl;
			ofstream Out;
			Out.open("AMat.txt");
			Out<<n<<"\n";
			for(int i=0;i<n;i=i+1){
			for(int j=0;j<n;j=j+1)Out<<A[i][j]<<" ";
			Out<<"\n";
			}
			Out.close();
		}
		else cout<<"\nDu har ikke gemt til fil"<<endl;
}

void IndlaesFraFilAogn(double A[Nmax][Nmax], int &n){
	ifstream In;
	In.open("AMat.txt");
	In>>n;
	for (int i=0;i<n;i++) for (int j=0;j<n;j++) In>>A[i][j];
	In.close();
}

void Ac(double A[Nmax][Nmax],double An[Nmax][Nmax],double lamn[Nmax],int &n){
	double U1[Nmax][Nmax], D1[Nmax], V1[Nmax][Nmax];
	double LamValsSo[Nmax], VMatSo[Nmax][Nmax];
	char Valgn4;
	ifstream In;
	In.open("A8.txt");
	In>>n;
	for (int i=0;i<n;i++) for (int j=0;j<n;j++) In>>An[i][j];
	In.close();
	cout<<"\nVaelg n=4? J/N: ";
	cin>>Valgn4;
	if (Valgn4=='j'||Valgn4=='J') n=4;
	else cout<<"Du har valgt at fortsætte med n=8"<<endl;
	cout<<"\nIndtast egenværdierne:"<<endl;
	for (int i=0;i<n;i++)
	{
		cout<<"Indtast egenværdi nr."<<i+1<<":";
		cin>>lamn[i];
	}
	Spektral(A,An,lamn,n);
	SorterNormer(lamn, An, LamValsSo, VMatSo, n);
	DanU1D1V1(LamValsSo,VMatSo,U1,D1,V1,n);
	cout<<"A bliver udprintet nedenunder"<<endl;
	UdskrivMatrix(A,n);
	cout<<"Dette er U1: "<<endl;
	UdskrivMatrix(U1,n);
	cout<<"Dette er V1: "<<endl;
	UdskrivMatrix(V1,n);
	cout<<"\nDette er D1: "<<endl;
	VecOutput(D1,n);
}

void NormMatrix(double M[Nmax][Nmax], int n){
	double Sum;
	for (int j=0;j<n;j++){
			Sum=0;
				for (int i=0;i<n;i++)
				{
					Sum=Sum+M[i][j]*M[i][j];
				}
				for (int k=0;k<n;k++)
				{
					M[k][j]=M[k][j]*1/sqrt(Sum);
				}
			}
}

void IndtastVektor(double v[Nmax], int n){
	cout<<"indtast elementer: "<<endl;
	for(int i=0;i<n;i++)
	{
		cout<<"element "<<i+1<<" :";
		cin>>v[i];

	}
}

void NormVektor(double v[Nmax],double vNorm[Nmax],double &L, int n){
	L=v[0];
	for (int i=1;i<n;i++) if (fabs(v[i])>fabs(L))  L=v[i];

	for (int k=0;k<n;k++) vNorm[k]=(1/L)*v[k];
}

void MultMatrixVektor(double K[Nmax][Nmax], double v[Nmax], double vprod[Nmax], int n){
	double sum;

	for (int i=0;i<n;i++)

	{
		sum=0;
		for (int j=0;j<n;j++) sum+=(K[i][j]*v[j]);
		vprod[i]=sum;
	}

}

void UdskrivMatrix(double M[Nmax][Nmax], int n){
	cout<<endl;
		for (int i = 0; i < n; i++){
			for (int j = 0; j <  n; j++){
	           cout <<setw(25)<<setprecision(14)<< M[i][j]<<" ";
			}
	     cout << endl;
		}
}

void MatrixGangeMatrix(double A[Nmax][Nmax], double M1[Nmax][Nmax],double M2[Nmax][Nmax], int n){
	double led[Nmax][Nmax];
	for (int i=0;i<n;i++) for (int j=0;j<n;j++) led[i][j]=0;

	for (int i=0;i<n;i++) for (int j=0;j<n;j++) for(int k=0;k<n;k++) led[i][j]+=(M2[i][k]*M1[k][j]);

	for(int i=0;i<n;i++) for(int j=0;j<n;j++) A[i][j]=led[i][j];
}

void Spektral(double A[Nmax][Nmax], double An[Nmax][Nmax],double lamn[Nmax],int n){
	double sum;
	for (int i=0;i<n;i++) for(int j=0;j<n;j++) A[i][j]=0;

	for (int k=0;k<n;k++){
		sum=0;
		for (int h=0;h<n;h++){
			sum+=An[h][k]*An[h][k];
		}
		for (int j=0;j<n;j++){
			for (int i=0;i<n;i++){
				A[i][j]+=lamn[k]/sum*An[i][k]*An[j][k];
			}
		}
	}
}


double DanMaxAbsDif(double M1[Nmax][Nmax], double M2[Nmax][Nmax], int n){
	double Nse=0;
	for (int i=0;i<n;i++) for (int j=0;j<n;j++)
	{
		if (fabs(M1[i][j]-M2[i][j])>fabs(Nse)) Nse=fabs(M1[i][j]-M2[i][j]);
	}
	return Nse;
}
void DanBilledMatrix(double Kn[Nmax][Nmax], int &n){
	cout<<"\nIndtast din ønskede n: ";cin>>n;
	for(int i=0;i<n;i++) for(int j=0;j<n;j++) Kn[i][j]=0;
	for(int i=0; i<n-1;i++){
		Kn[i][i]=1;
		Kn[i][i+1]=1;
		Kn[i+1][i]=1;
	}
	Kn[n-1][n-1]=1;
	for(int i=0; i<n-1;i++){
		Kn[n-1-i][i]=1;
		Kn[n-2-i][i]=1;
		Kn[n-1-i][i+1]=1;
	}
	Kn[0][n-1]=1;
}
void UdskrivBilledMatrix(double Kn[Nmax][Nmax], int n){
	cout<<endl;
		for (int i = 0; i < n; i++){
			for (int j = 0; j <  n; j++){
			if(fabs(Kn[i][j])<1)				cout<<setw(1)<<setprecision(1)<<0;
			else								cout <<setw(1)<<Kn[i][j];
			}
	     cout << endl;
		}
}
void SorterNormer(double LamValsUs[Nmax], double WMatUs[Nmax][Nmax], double LamValsSo[Nmax], double VMatSo[Nmax][Nmax], int n){
	int indexs[Nmax];
	for(int i=0;i<n;i++)	indexs[i]=i;
	for(int i=0;i<n;i++)	LamValsSo[i]=LamValsUs[i];
	Sort(LamValsSo,0,n-1,indexs);
	for(int j=0;j<n;j++)	for(int i=0;i<n;i++)	VMatSo[i][j]=WMatUs[i][indexs[j]];
	NormMatrix(VMatSo,n);
}
void Sort(double v[Nmax], int left, int right, int indexs[Nmax]){
	int tmpindex;
	double pivot,tmp;
	pivot=v[(right+left)/2];
	int i=left, j=right;

	while(i<=j){
		while(fabs(v[i])>fabs(pivot)){
			i++;
		}
		while(fabs(v[j])<fabs(pivot)){
			j--;
		}
		if(i<=j){
			tmp=v[i];
			v[i]=v[j];
			v[j]=tmp;
			tmpindex=indexs[i];
			indexs[i]=indexs[j];
			indexs[j]=tmpindex;
			i++;
			j--;
		}
	}
	if(left<j){
		Sort(v,left,j,indexs);
	}
	if(i<right){
		Sort(v,i,right,indexs);
	}
}
void DanU1D1V1(double LamValsSo[Nmax], double VMatSo[Nmax][Nmax], double U1[Nmax][Nmax], double D1[Nmax], double V1[Nmax][Nmax], int n){
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(LamValsSo[j]<0){
					U1[i][j]=VMatSo[i][j]*-1;
			}
			else	U1[i][j]=VMatSo[i][j];
			V1[i][j]=VMatSo[i][j];
		}
	}
	for(int i=0;i<n;i++){
		D1[i]=fabs(LamValsSo[i]);
	}

}
void VecOutput(double v[Nmax], int n){
cout<<"["<<v[0];

	for(int i=1;i<n;i++)
	{
	cout<<" , "<<setprecision(14)<<v[i];
	}

cout<<"]";

}
void Rk(double a[Nmax], double b[Nmax-1], double c[Nmax-1], double s[Nmax-1], int n){
	double r;
	double t=b[0];
	for(int i=0;i<n-1;i++){
		c[i]=0;
		s[i]=0;
	}

	for(int i=0;i<n-1;i++){
		r=sqrt(pow(a[i],2)+pow(t,2));
		c[i]=a[i]/r;
		s[i]=t/r;
		a[i]=r;
		t=b[i];
		b[i]=t*c[i]+a[i+1]*s[i];
		a[i+1]=-t*s[i]+a[i+1]*c[i];
		if(i!=n-1){
			t=b[i+1];
			b[i+1]=t*c[i];
		}
		else break;
	}
}
void Ak(double a[Nmax], double b[Nmax-1], double c[Nmax-1], double s[Nmax-1], int n){
	for(int i=0;i<n-1;i++){
		a[i]=a[i]*c[i]+b[i]*s[i];
		b[i]=a[i+1]*s[i];
		a[i+1]=a[i+1]*c[i];
	}
}
void UpdateQonIterk(double Q[Nmax][Nmax], double c[Nmax-1], double s[Nmax-1], int n){
	double v1,v2;
	for(int i=0;i<n-1;i++){
		for(int j=0;j<n;j++){
			v1=c[i]*Q[j][i]+s[i]*Q[j][i+1];
			v2=(-s[i])*Q[j][i]+c[i]*Q[j][i+1];
			Q[j][i]=v1;
			Q[j][i+1]=v2;
		}
	}
}
double MaxNum(double b[Nmax], int n){
	double L=fabs(b[0]);
	for(int i=1;i<n;i++){
		if(L<fabs(b[i])){
			L=fabs(b[i]);
		}
	}
	return L;
}
void QR(double AK[Nmax][Nmax],double Q[Nmax][Nmax],double Q0[Nmax][Nmax],double a[Nmax],int n){
	char Valgeps;
	double eps;
	double b[Nmax-1],c[Nmax-1],s[Nmax-1];
	int k=0, N;
	cout<<"\nØnsker du at indtaste eps og N selv eller gøre brug af eps=0.000000000000001 og N=100000: ";
	cout<<"Indtast 1 for at indtaste selv og 2 for automatisk: ";
	cin>>Valgeps;
	if(Valgeps=='1'){
		cout<<"\nIndtast nu din eps: ";
		cin>>eps;
		cout<<"\nIndtast nu din N: ";
		cin>>N;
	}
	else{
		eps=0.000000000000001;
//		eps=0.1;
		N=10000;
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			Q[i][j]=0;
		}
	}
	for(int i=0;i<n;i++) Q[i][i]=1;
	a[0]=AK[0][0];
	for(int i=1;i<n;i++){
		a[i]=AK[i][i];
		b[i-1]=AK[i-1][i];

	}
	do{
		k++;
		Rk(a,b,c,s,n);
		Ak(a,b,c,s,n);
		UpdateQonIterk(Q,c,s,n);
	}while(MaxNum(b,n)>eps&&k<N);
	MatrixGangeMatrix(Q,Q,Q0,n);
	cout<<endl<<"iterationer k: ("<<k<<"): ";
	cout<<endl<<"Sidste b: ";VecOutput(b,n-1);
	cout<<endl<<"Din eps er: "<<eps<<endl;
	cout<<endl<<"Sidste a - og egenværdier: ";VecOutput(a,n);
//	cout<<endl<<"Sidste c: ";VecOutput(c,n-1);
//	cout<<endl<<"Sidste s: ";VecOutput(s,n-1);
	cout<<endl<<"Sidste Q - og egenvektorer: ";UdskrivMatrix(Q,n);
}
double IndreProdukt(double v1[Nmax],double v2[Nmax],int n){

	double innerprodukt=0;
	for(int i=0; i<n;i++)	  innerprodukt += v1[i] * v2[i];

	return innerprodukt;
}
void TriDiagonalisering(double A[Nmax][Nmax], double AK[Nmax][Nmax], double Q0[Nmax][Nmax], int n){
	double xk[Nmax],sk,rk,wk[Nmax],vk[Nmax],ck,qk[Nmax],Hk[Nmax][Nmax];
	for (int i=0;i<n;i++)
	{
		for (int j=0;j<n;j++)
		{
			AK[i][j]=A[i][j];
			Q0[i][j]=0;
		}
	}
	for(int i=0;i<n;i++)	Q0[i][i]=1;

	for (int k=0;k<n-2;k++)
	{
		for (int i=0;i<n;i++) for(int j=0;j<n;j++) Hk[i][j]=0;

		for (int i=0;i<n;i++) xk[i]=AK[i][k];
		sk=0;
		for (int j=k+1;j<n;j++) sk+=pow(xk[j],2);
		sk=sqrt(sk);
		rk=sqrt(2*sk*(sk+fabs(xk[k+1])));
		wk[k]=0;
		if(xk[k+1]>=0) wk[k+1]=(fabs(xk[k+1])+sk);
		else wk[k+1]=-(fabs(xk[k+1])+sk);
		for (int i=k+2;i<n;i++) wk[i]=xk[i];
		for (int i=k+1;i<n;i++) wk[i]=1/rk*wk[i];
		MultMatrixVektor(AK,wk,vk,n);
		ck=IndreProdukt(wk,vk,n);
		for (int i=0;i<n;i++) qk[i]=vk[i]-ck*wk[i];
		for (int j=0;j<n;j++)
		{
			Hk[j][j]=1;
			for (int i=0;i<n;i++)
			{
				AK[i][j]=AK[i][j]-2*wk[i]*qk[j]-2*wk[j]*qk[i];
				Hk[i][j]=Hk[i][j]-2*wk[i]*wk[j];
			}
		}
		MatrixGangeMatrix(Q0,Hk,Q0,n);
	}
}
void svd(double A[Nmax][Nmax], double D1[Nmax], double V1[Nmax][Nmax], double U1[Nmax][Nmax], int n){
	double AS[Nmax][Nmax], AK[Nmax][Nmax], Q0[Nmax][Nmax], Q[Nmax][Nmax], a[Nmax],as[Nmax], AT[Nmax][Nmax];
	double D1Inv[Nmax], AV[Nmax][Nmax], VT[Nmax][Nmax], UD[Nmax][Nmax], Akontrol[Nmax][Nmax], VDInv[Nmax][Nmax], UT[Nmax][Nmax];
	double VMatSo[Nmax][Nmax], APseudo[Nmax][Nmax];
	int r=n;
	for(int i=0;i<n;i++) for(int j=0;j<n;j++) AT[i][j]=A[j][i];
	MatrixGangeMatrix(AS,A,AT,n);
	cout<<"DIN ATA ER: ";
	UdskrivMatrix(AS,n);
	TriDiagonalisering(AS,AK,Q0,n);
	QR(AK,Q,Q0,a,n);
	SorterNormer(a,Q,as,VMatSo,n);
	cout<<endl<<endl;
	for(int i=0;i<n;i++)	if(as[i]<0.000000001) r--;
	cout<<"\nRangen af din matrice er: "<<r<<endl;
	for(int i=0;i<r;i++){
		D1[i]=sqrt(as[i]);
		D1Inv[i]=1/D1[i];
	}
	for(int i=0;i<n;i++) for(int j=0;j<r;j++) V1[i][j]=VMatSo[i][j];
	///////		Vi har nu alle elementer til at lave SVD, hvilket vil ske nu 	///////
	MatrixGangeMatrix2(AV,A,V1,n,r,n);
	MatrixGangeDia(U1,AV,D1Inv,n,r);
	cout<<"Nu udfører vi kontrol. Denne skal danne A: "<<endl;
	for(int i=0;i<n;i++) for(int j=0;j<n;j++) VT[j][i]=V1[i][j];
	MatrixGangeDia(UD,U1,D1,n,r);
	MatrixGangeMatrix2(Akontrol,UD,VT,n,n,r);
	UdskrivMatrix(Akontrol,n);
	cout<<"Dette er oprindelige A: "<<endl;
	UdskrivMatrix(A,n);
	cout<<"Nu findes den numerisk største forskel, der skal give 0, da de er identiske: "<<DanMaxAbsDif(Akontrol,A,n)<<endl<<endl;
	cout<<"\nNu udskrives SVD faktorerne"<<endl;
	cout<<"Dette er U1: "<<endl;
	UdskrivIkkeMatrix(U1,n,r);
	cout<<"Dette er V1: "<<endl;
	UdskrivIkkeMatrix(V1,n,r);
	cout<<"\nDette er D1: "<<endl;
	VecOutput(D1,r);
	///////		SVD er nu dannet og vil blive kontrolleret 		///////
	for(int i=0;i<n;i++) for(int j=0;j<n;j++) UT[i][j]=U1[j][i];
	MatrixGangeDia(VDInv,V1,D1Inv,n,r);
	MatrixGangeMatrix2(APseudo,VDInv,UT,n,n,r);
	cout<<"\nDette er APseudo: ";
	UdskrivMatrix(APseudo,n);
	///////		Nulrummet 		///////
	if(r<n){
		double NulKontrol[Nmax][Nmax], Nulrum[Nmax][Nmax];
		cout<<"\nDin base for Nul{A} er fundet ved v(r+1),...,v(n)";
		cout<<endl;
		for(int i=0;i<n;i++) for(int j=r;j<n;j++) Nulrum[i][j]=VMatSo[i][j];
		UdskrivNulrumMatrix(Nulrum,n,r);
		cout<<"For at kontrollere, at dette er Nulrummet, så ganges de på A og skal få 0-matricen";
		MatrixGangeMatrix2(NulKontrol,A,Nulrum,n,r,n);
		UdskrivNulrumMatrix(NulKontrol,n,r);
	}
}
void Intro(char &Valgabcd){
	cout<<"Dette program består af to hovedemner.";
	cout<<"\n\nDet første hovedemne har til formål, at tillade dig, at finde egenløsningerne til en symmetrisk A(nxn) matrix.";
	cout<<"\nDenne vil have n reele egenværdier og gør brug af Householder transformationer og Givens-rotationer.";
	cout<<"\nNår dette er udført, så vil der blive printet en Q-matrice, der indeholder vores egenvektorer og en diagonalmatrice, med egenværdierne på diagonalen.";
	cout<<"\n\n";
	cout<<"Anden hovedemne har til formål at bestemme den smalle SVD-faktorisering af A(nxn) (Ikke krævet symmetrisk): A=U1*D1*V1^T";
	cout<<"\n\nDu vil nu få muligheden for at tilvejebringe A på fire forskellige måder: ";
	cout<<"\na) Her skal der gøres brug af brugerindtastning af n og A(nxn)";
	cout<<"\nb) Her vil n og A(nxn) blive indlæst fra fil";
	cout<<"\nc) Konstruktion af symmetrisk A(nxn)=A^T(nxn) med kendte egenløsninger og kendte U1, D1, V1 ud fra brugervalgte egenværdier";
	cout<<"\nd) Fremstilling af billedmatricer K(nxn)";
	cout<<"\n\nVælg a, b, c eller d her: Valgabcd=";
	cin>>Valgabcd;
}
void Del2(char &Valg12){
	cout<<"\n\nBrugeren skal nu vælge imellem at finde egenløsningerne ved QR på en symmetrisk A";
	cout<<"\nAnden mulighed er at bruge QR metoden på A^T*A og herefter danne SVD-faktorerne";
	cout<<"\nIndtast 1 for mulighed 1 og 2 for mulighed 2. Indtast nu: ";
	cin>>Valg12;
}
void A1(double A[Nmax][Nmax], int &n){
	cout<<"\nDu har indtastet a, og dermed valgt mulighed a): Brugerindtastning af n og A";
	IndtastAogn(A,n);
	cout<<"\nDin A er hermed: ";
	UdskrivMatrix(A,n);
}
void B1(double A[Nmax][Nmax], int &n){
	cout<<"\nDu har indtastet b, og dermed valgt mulighed b): Indlæsning af n og A fra fil";
	IndlaesFraFilAogn(A,n);
	cout<<"\nDu har nu indlæst din A og n"<<endl;
	cout<<"\nDin A er hermed: ";
	UdskrivMatrix(A,n);
}
void C1(double A[Nmax][Nmax],double An[Nmax][Nmax],double lamn[Nmax],int &n){
	cout<<"\nDu har indtastet c, og dermed valgt mulighed c): Konstruktion af symmetrisk A fra brugerindtastede egenværdier";
	Ac(A,An,lamn,n);
}
void DI1(double A[Nmax][Nmax], int &n){
	cout<<"\nDu har indtastet d, og dermed valgt mulighed d): Fremstilling af billedmatricer K fra brugerindtastet n";
	DanBilledMatrix(A,n);
	cout<<"\nDin A er nu dannet og vil blive udprintet"<<endl;
	UdskrivBilledMatrix(A,n);
}
void MatrixGangeMatrix2(double A[Nmax][Nmax], double M1[Nmax][Nmax],double M2[Nmax][Nmax], int n, int r, int l)
{
	double led[Nmax][Nmax];
	for (int i=0;i<n;i++) for (int j=0;j<n;j++) led[i][j]=0;

	for (int i=0;i<n;i++) for (int j=0;j<r;j++) for(int k=0;k<l;k++) led[i][j]+=(M1[i][k]*M2[k][j]);

	for(int i=0;i<n;i++) for(int j=0;j<r;j++) A[i][j]=led[i][j];
}
void MatrixGangeDia(double A[Nmax][Nmax], double M1[Nmax][Nmax],double M2[Nmax], int n, int r){
	for (int i=0;i<n;i++) for(int k=0;k<r;k++) A[i][k]=(M1[i][k]*M2[k]);
}
void UdskrivNulrumMatrix(double M[Nmax][Nmax], int n, int r){
	cout<<endl;
		for (int i=0;i<n;i++){
			for (int j=r;j<n;j++){
		           cout <<setw(25)<<setprecision(14)<< M[i][j]<<" ";
			}
	     cout << endl;
		}
}
void UdskrivIkkeMatrix(double M[Nmax][Nmax], int n, int r){
	cout<<endl;
		for (int i=0;i<n;i++){
			for (int j=0;j<r;j++){
		           cout <<setw(25)<<setprecision(14)<< M[i][j]<<" ";
			}
	     cout << endl;
		}
}

This snippet took 0.07 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).