Tyle już mam (chyba to jest dobrze):
Kod: Zaznacz cały
using System;
namespace zad
{
class Program
{
static double[] Gauss(double[,] A){
int n = A.GetLength(0);
double[] x = new double[n];
double max = 0;
int r = 0;
// wyszukiwanie elementu MAX
for (int k = 0; k < n; k++){
max = A[k, k];
r = k;
for (int i = k; i < n; i++) {
if (Math.Abs(A[i, k]) > Math.Abs(max)){
max = A[i, k];
r = i;}}
if (max == 0){
Console.WriteLine("Macierz ukladu osobliwa!");
break;
} else {
for (int j = k; j <= n; j++){
// zamiana wierszy k z r
double temp = A[k, j];
A[k, j] = A[r, j];
A[r, j] = temp; }
// utworzenie macierzy trojkatnej gornej
for (int i = k + 1; i < n; i++)
for (int j = k + 1; j <= n; j++)
A[i, j] = A[i, j] - ((A[i, k] / max) * A[k, j]);}
if (max != 0)
// wyliczanie zmiennych od ostatniej do pierwszej
for (int i = n - 1; i >= 0; i--){
double s = 0;
for (int m = i + 1; m < n; m++)
s = s + A[i, m] * x[m];
x[i] = (A[i, n] - s) / A[i, i]; }}
// wyswietlenie wynikow
for (int i = 0; i < n; i++)
Console.WriteLine("C[{0}] = {1}; ", i, x[i]);
return x;}
static double[,] wyp_macierz(int n, double[,] tab, double[] y, double h, double alfa1, double beta1)
{
//WYPELNIAMY MACIERZ ZERAMI
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n + 1; j++)
{
if (i == j)
tab[i, j] = 4;
else if (i == 0 && j == 1)
tab[i, j] = 2;
else if (i == n - 1 && j == n - 2)
tab[i, j] = 2;
else if (j == i - 1)
tab[i, j] = 1;
else if (i == j - 1)
tab[i, j] = 1;
else
tab[i, j] = 0;
}
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n + 1; j++)
if (j == n)
{
tab[i, j] = y[i];
if (i == 0)
tab[i, j] = y[i] + ((1 / 3) * h * alfa1);
else if (i == n)
tab[i, j] = y[i] + ((1 / 3) * h * beta1);
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n + 1; j++)
Console.Write(tab[i, j] + " ");
Console.WriteLine();
}
return tab;
}
static double[] f(double[] x)
{
int n = x.Length;
double[] fx = new double[n];
for (int i = 0; i < n; i++)
fx[i] = 1 / (1 + (x[i] * x[i]));
return fx;
}
static void Main(string[] args)
{
int n = 10;
double[,] tab = new double[n, n + 1];
double a = -1, b = 1;
double x = 0;
double alfa1 = 0.5, beta1 = -0.5;
double h = (b - a) / n;
double m = (x - a) / h;
double t = ((x - a) / h) - m;
double[] xx = new double[n];
double[] y = new double[n];
double[] C = new double[n];
for (int i = 0; i < n; i++)
xx[i] = a + i * h;
y = f(xx);
for (int i = 0; i < n; i++)
Console.WriteLine("x={0} .........y= {1}", xx[i], y[i]);
Console.WriteLine();
C = Gauss(wyp_macierz(n, tab, y, h, alfa1, beta1));
Console.ReadLine();
}
}
}
\(\displaystyle{ s(x)=\sum_{i=-1}^{n+1}c_i\Phi_i^3(x) \mbox{ gdzie: }a\leq x\leq b\;}\)
Tylko nierozumiem jak programistycznie zastosowac ten wzór. Mam n elementów w wektorze Ci to skąd nagle mam ich wziąść n+2? Znalazłem również wzór na \(\displaystyle{ \Phi_i^3(x)}\) i zapisałem go tak:
Kod: Zaznacz cały
for (int i = 0; i < n; i++)
{
if (punkt >= x[i - 2] && punkt <= x[i - 1])
FI[i] = (1 / Math.Pow(h, 3)) * Math.Pow(punkt - x[i - 2], 3);
else if (punkt >= x[i - 2] && punkt <= x[i - 1])
FI[i] = (1 / Math.Pow(h, 3)) * (Math.Pow(h, 3) + 3 * Math.Pow(h, 2) * (punkt - x[i - 1]) + 3 * h * Math.Pow((punkt - x[i - 1]), 2) - 3 * Math.Pow((punkt - x[i - 1]), 3));
if (punkt >= x[i - 1] && punkt <= x[i])
FI[i] = (1 / Math.Pow(h, 3)) * (Math.Pow(h, 3) + 3 * Math.Pow(h, 2) * (x[i + 1] - punkt) + 3 * h * Math.Pow((x[i + 1] - punkt), 2) - 3 * Math.Pow((x[i + 1] - punkt), 3));
else if (punkt >= x[i] && punkt <= x[i + 1] && i<n-2)
FI[i] = (1 / Math.Pow(h, 3)) * Math.Pow((x[i + 2] - punkt), 3);
else
FI[i] = 0;
}
Z góry dzięki za każdą rade