Mógłby mi ktoś wytłumaczyć dlaczego program w podkreślonych iteracjach nie bierz wartości z poprzedniej iteracji lecz jakąś wartość z nie wiadomo skąd?
#include <stdio.h>
#include <iostream>
#include <random>
#include <cmath>
#include <math.h>
#include <fstream>
using namespace std;
void proba_referencyjna_jednostajny();
void proba_referencyjna_laplace();
void proba_referncyjna_normalny();
void proba_referncyjna_arcsin();
float p_xref_jednostajny(float xref);
float p_xref_laplace(float xref);
float p_xref_normalny(float xref);
float p_xref_arcsin(float xref);
float sgn1(float x);
void main()
{
proba_referencyjna_jednostajny();
}
void proba_referencyjna_jednostajny()
{
//float tablica[liczba wierszy][liczba kolumn]
float xref[200];
float j, k, l, n; // gdzie n-liczebnosc
float cov[200][200]; //cov k l
float covodwrotna[200][200];
float a[200][3];
float at[3][200];
float pom1[3][200];
float pom2[200][200];
float pom2odwrucona[3][3];
float REC[3][200];
cout << "ROZKLAD JEDNOSTAJNY \n";
cout << "Podaj liczebnosc n \n";
cin >> n;
//wyznaczanie x referencyjnego
k = 1.0;
for (int i = 1; i < n + 1; i++)
{
xref[i] = (k / (n + 1) - 0.5) * 2 * sqrt(3);
k = k + 1.0;
}
//Wyznaczanie miaczierzy kowariancji
k = 1.0;
for (int i = 1; i < n + 1; i++)//k
{
l = 1.0;
for (int j = 1; j <n + 1; j++)//l
{
if (i < j)
{
cov[j][i] = (k*(n + 1 - l) / (n*pow(n + 1, 2)))*(1 / (p_xref_jednostajny(xref[i]) * p_xref_jednostajny(xref[j])));
//cout << k << "|" << l << "|" << xref[i]<<"|"<<xref[j] << "|" << cov[i][j] << "\n";
}
else
{
cov[j][i] = (l*(n + 1 - k) / (n*pow(n + 1, 2)))*(1 / (p_xref_jednostajny(xref[i]) * p_xref_jednostajny(xref[j])));
//cout << k << "|" << l << "|" << xref[i] << "|" << xref[j] << "|" << cov[i][j] << "\n";
}
l = l + 1.0;
}
k = k + 1.0;
}
//Obliczanie macierz A
for (int i = 1; i < n + 1; i++)
{
a[i][2] = 1.0;
a[i][1] = xref[i];
}
//Wyznaczanie macierz A transponowanej
for (int i = 1; i < n + 1; i++)
{
at[1][i] = 1.0;
at[2][i] = a[i][1];
}
//Wyznaczanie macierzy kowariancji odwruconej
for (int i = 1; i < n+1; i++)//k
{
for (int j = 1; j <n+1 ; j++)//l
covodwrotna[j][i] = cov[j][i];
}
for (int i = 1; i < n+1; i++)
{
covodwrotna[i][i] = 1 / covodwrotna[i][i];
for (int j = 1; j < n+1; j++) if (j != i)
{
covodwrotna[j][i] = covodwrotna[j][i] * covodwrotna[i][i];
for (int k = 1; k < n + 1; k++) if (k != i)
{
covodwrotna[j][k] -= covodwrotna[j][i] * covodwrotna[i][k];
if ( j == (n))
covodwrotna[i][k] = -(covodwrotna[i][k] * covodwrotna[i][i]);
}
}
}
int w = n;
for (int j = 1; j < w; j++) covodwrotna[w][j] = -(covodwrotna[w][j] * covodwrotna[w][w]);
//Wyznaczanie macierz REC
//Mnożenie macierzy At i W(covodwrtorna)->>pom1
float suma, iloczyn, x;
for (int i = 1; i<3; i++)
for (int l = 1; l < n + 1; l++)
{
pom1[i][l] = 0;
}
for (int i = 1; i < 3; i++)
{
for (int l = 1; l < n+1; l++)
{
for (int j = 1; j < n+1; j++)
{
pom1[i][l] = pom1[i][l] + at[i][j] * covodwrotna[j][l];
cout << pom1[i][l] << "=" << pom1[i][l] << "+" << at[i][j] << "*" << covodwrotna[j][l]<<"\n";
}
}
}
// pom1*at -> pom2
for (int i = 1; i<3; i++)
for (int l = 1; l < n + 1; l++)
{
pom2[i][l] = 0;
}
for (int i = 1; i < 3; i++)
{
for (int l = 1; l < 3; l++)
{
for (int j = 1; j < n + 1; j++)
{
cout << pom2[i][l] << "+" << pom1[i][j] << "*" << a[j][l] << "=";
pom2[i][l] = pom2[i][l] + pom1[i][j] * a[j][l];
cout << pom2[i][l]<<" \n";
}cout << l << " l\n";
}cout << i << " i \n";
}
pom2[1][1] = pom2[2][2] = 0;
///odw pom2
float y;
y = 1 / ((pom2[1][1] * pom2[2][2]) - (pom2[2][1] * pom2[1][2]));
pom2odwrucona[1][1] = pom2[2][2] * y;
pom2odwrucona[1][2] = -pom2[1][2] * y;
pom2odwrucona[2][1] = -pom2[2][1] * y;
pom2odwrucona[2][2] = pom2[1][1] * y;
// obliczanie pom2odwrucone*pom2
for (int i = 1; i < 3; i++)
{
for (int j = 1; j < n + 1; j++)
{
REC[i][j] = 0;
}
}
for (int i = 1; i < 3; i++)
{
for (int l = 1; l < n+1; l++)
{
for (int j = 1; j < 3; j++)
{
//cout << pom2[i][l] << "+" << pom1[i][j] << "*" << a[j][l] << "=";
REC[i][l] = REC[i][l] + pom2odwrucona[i][j] * pom1[j][l];
//cout << pom2[i][l] << " \n";
}cout << l << " l\n";
}cout << i << " i \n";
}
// Wyswietlanie obliczonych danych
cout << "Liczebnosc = " << n << "\n";
cout << "\n";
cout << "X referencyjne \n";
for (int i = 1; i < n + 1; i++)
{
cout.width(10);
cout << xref[i] << " ";
}
cout << "\n";
cout << "\n";
cout << "Macierz kowariancji \n";
for (int i = 1; i < n + 1; i++)//k
{
for (int j = 1; j < n + 1; j++)//l
{
cout.width(10);
cout << cov[j][i] << " ";
}
cout << "\n";
}
cout << "\n";
cout << "Macierz A \n";
for (int i = 1; i < n + 1; i++)
{
cout.width(10);
cout << a[i][1] << " | " << a[i][2] << "\n";
}
cout << "\n";
cout << "Macierz A transponowana \n";
for (int i = 1; i < 2 + 1; i++)
{
for (int j = 1; j < n + 1; j++)
{
cout.width(10);
cout << at[i][j] << " ";
}
cout << "\n";
}
cout << "\n";
cout << "Macierz kowariancji odwrotna \n";
for (int i = 1; i < n + 1; i++)//k
{
for (int j = 1; j < n + 1; j++)//l
{
cout.width(10);
cout << covodwrotna[j][i] << " ";
}
cout << "\n";
}
cout << "\n";
cout << "Macierz REC \n";
for (int i = 1; i <3; i++)//k
{
for (int j = 1; j < n + 1; j++)//l
{
cout.width(15);
cout << pom1[i][j] << " ";
}
cout << "\n";
}
cout << "\n";
for (int i = 1; i <3; i++)//k
{
for (int j = 1; j < 3; j++)//l
{
cout.width(15);
cout << pom2[i][j] << " ";
}
cout << "\n";
}
cout << "\n";
for (int i = 1; i <3; i++)//k
{
for (int j = 1; j < 3; j++)//l
{
cout.width(15);
cout << pom2odwrucona[i][j] << " ";
}
cout << "\n";
}
cout << "\n";
for (int i = 1; i <3; i++)//k
{
for (int j = 1; j < n+1; j++)//l
{
cout.width(15);
cout << REC[i][j] << " ";
}
cout << "\n";
}
}
float p_xref_jednostajny(float xref)
{
float px;
if (abs(xref) <= sqrt(3))
px = 1 / (2 * sqrt(3));
else
px = 0;
return px;
}
- Bez tytułu1.png (34 KB) - ściągnięć: 144