
01.02.2009, 17:56
|
|
Постоянный
Регистрация: 15.06.2008
Сообщений: 941
Провел на форуме: 5111568
Репутация:
2399
|
|
может кому пригодитса
Решить систему нел. уравнений модифицированным методом Ньютона, выбирая за начальные приближения . Итерации проводить к совпадению двух последовательных приближений с погрешностью . Производные вычислять методом конечных разниц, вращения матрицы, проводить классическим методом Гауса.
C#
Код:
using System;
using System.Collections.Generic;
using System.Text;
namespace ZI_22_KMDI_5
{
class Lab
{
const int n = 2;
double E = 0.00001;
double[] X1 = { 0, 0 };
double[] X2 = new double[n];
double[,] MatrixJakobi(double[] X)
{
double[,] J = new double[n, n];
double y, h = 0.000000001;
for (int i = 0; i < n; i++)
{
y = Funkcia(X, i);
for(int k = 0; k < n; k++)
{
X[k] = X[k] + h;
J[i,k] = (Funkcia(X,i) - y)/h;
X[k] = X[k] - h;
}
}
return (J);
}
double Funkcia(double[] X, int f)
{
double fx = 0;
if (f == 0)
fx = -X[0] + X[0] * X[0] - X[1] * X[1] + 0.1;
if (f == 1)
fx = -X[1] + 2 * X[0] * X[1] - 0.1;
return (fx);
}
double[] Funkcii(double[] X)
{
double[] F = new double[n];
F[0] = -X[0] + X[0] * X[0] - X[1] * X[1] + 0.1;
F[1] = -X[1] + 2 * X[0] * X[1] - 0.1;
return (F);
}
bool Pohubka(double[] mX1, double[] mX2)
{
double a, b;
a = (mX2[0] - mX1[0]) / mX1[0]; a = Math.Abs(a);
b = (mX2[1] - mX1[1]) / mX1[1]; b = Math.Abs(b);
Console.WriteLine(Math.Max(a,b));
if (Math.Max(a,b) <= E)
return (true);
else
return (false);
}
double[,] Obertanna(double[,] A)
{
double[] b = new double[n];
double[,] X = new double[n, n];
double[] dX = new double[n];
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
if (k == i)
b[i] = 1;
else
b[i] = 0;
}
dX = Gaus(A, b);
for (int i = 0; i < n; i++)
X[i, k] = dX[i];
}
return (X);
}
double[] Gaus(double[,] A, double[] b)
{
double[,] GausA = new double[n, (n + 1)];
double[] X = new double[n];
for(int i = 0; i < n; i++)
for (int j = 0; j < (n + 1); j++)
{
if (j != n)
GausA[i, j] = A[i, j];
else
GausA[i, j] = -b[i];
}
for (int l = 0; l < n - 1; l++)
{
double c = GausA[l, l];
for (int k = l + 1; k < (n+1); k++)
{
GausA[l, k] = -GausA[l, k] / c;
for (int i = l + 1; i < n; i++)
GausA[i, k] = GausA[i, k] + GausA[i, l] * GausA[l, k];
}
}
X[n - 1] = -GausA[n - 1, n] / GausA[n - 1, n - 1];
for (int i = n - 2; i >= 0; i--)
{
double s = GausA[i, n];
for (int k = i + 1; k < n; k++)
s = s + GausA[i, k] * X[k];
X[i] = s;
}
return (X);
}
double[] Mnogenna(double[,] A, double[] B)
{
double[] C = new double[n];
C[0] = A[0, 0] * B[0] + A[0, 1] * B[1];
C[1] = A[1, 0] * B[0] + A[1, 1] * B[1];
return (C);
}
public void Calculate()
{
double[,] A = new double[n, n];
double[] fX = new double[n];
double[] Mn = new double[n];
int d = 0;
A = MatrixJakobi(X1);
A = Obertanna(A);
fX = Funkcii(X1);
Mn = Mnogenna(A, fX);
X2[0] = X1[0] - Mn[0];
X2[1] = X1[1] - Mn[1];
d++;
while (Pohubka(X1, X2) != true)
{
if (d > 5)
{
A = MatrixJakobi(X1);
A = Obertanna(A);
}
X1[0] = X2[0];
X1[1] = X2[1];
fX = Funkcii(X1);
Mn = Mnogenna(A, fX);
X2[0] = X1[0] - Mn[0];
X2[1] = X1[1] - Mn[1];
d++;
Console.WriteLine("x(1) = " + X2[0]);
Console.WriteLine("x(2) = " + X2[1]);
}
Console.WriteLine("------");
Console.WriteLine("Результат");
Console.WriteLine("x(1) = " + X2[0]);
Console.WriteLine("x(2) = " + X2[1]);
Console.WriteLine("------");
Console.WriteLine("Перевiрка 1");
Console.WriteLine(-X2[0] + X2[0] * X2[0] - X2[1] * X2[1] + 0.1);
Console.WriteLine(-X2[1] + 2 * X2[0] * X2[1] - 0.1);
Console.WriteLine("Перевiрка 2");
Console.WriteLine(X2[0] + " = " + (X2[0] * X2[0] - X2[1] * X2[1] + 0.1));
Console.WriteLine(X2[1] + " = " + (2 * X2[0] * X2[1] - 0.1));
}
}
class Program
{
static void Main(string[] args)
{
Lab lab5 = new Lab();
lab5.Calculate();
Console.Read();
}
}
}
|
|
|

01.02.2009, 17:57
|
|
Постоянный
Регистрация: 15.06.2008
Сообщений: 941
Провел на форуме: 5111568
Репутация:
2399
|
|
метод Рунге-Кутта 4 порядка:
Код:
using System;
using System.Collections.Generic;
using System.Text;
namespace ZI_22_KMDI_6
{
class RyngeRytta4
{
const int n = 2; // Порядок системи
const double h = 0.1; // Крок
double x, a = 0, b = 1; // Проміжок
global double[] y = new double[n]; //если небольшой масив
global double[] f = new double[n]; //тогда можна без global
void dy() // Праві частини рівнянь
{
f[0] = y[1];
f[1] = (8 * y[1] - 5 * y[0] - 4 * Math.Exp(x) * Math.Sin(x / 2)) / 4;
}
public void Calculate()
{
double[] K1 = new double[n];
double[] K2 = new double[n];
double[] K3 = new double[n];
double[] K4 = new double[n];
double[] z = new double[n];
// Початкові значення
y[0] = 1; y[1] = 1;
x = a;
do
{
dy();
for (int i = 0; i < n; i++)
{
K1[i] = f[i];
z[i] = y[i];
y[i] = z[i] + 0.5 * h * K1[i];
}
x = x + 0.5 * h;
dy();
for (int i = 0; i < n; i++)
{
K2[i] = f[i];
y[i] = z[i] + 0.5 * h * K2[i];
}
dy();
for (int i = 0; i < n; i++)
{
K3[i] = f[i];
y[i] = z[i] + 0.5 * h * K3[i];
}
x = x + 0.5 * h;
dy();
for (int i = 0; i < n; i++)
{
K4[i] = f[i];
y[i] = z[i] + h * (K1[i] + K4[i] + 2 * (K2[i] + K3[i])) / 6;
}
Console.WriteLine("x = " + x + "; y = " + y[0] + "; y' = " + y[1]);
}
while (x < b);
}
}
class Program
{
static void Main(string[] args)
{
RyngeRytta4 Lab6 = new RyngeRytta4();
Lab6.Calculate();
Console.Read();
}
}
}
Последний раз редактировалось eLWAux; 01.02.2009 в 18:33..
|
|
|

01.02.2009, 17:59
|
|
Постоянный
Регистрация: 15.06.2008
Сообщений: 941
Провел на форуме: 5111568
Репутация:
2399
|
|
опять задача из екзамена:
Решить систему уравнений стандартным методом Ньютона без вращения матрицы Якоби(систему линейных уравнений алгебраизма развязать методом Гаусса с формой столбца расписания без выбора главного элемента; якобиан обч. разностным методом), выбирая за начальные приближения
С:
Код:
#include <stdio.h>
#include <math.h>
#include <conio.h>
#define n 2
void main(void)
{
clrscr();
int i, j, L, k, m;
const double E=1e-5;
double x[n], Xprev[n], F[n], J[n][n], a[n][n+1], deltaX[n];
double f(int i,double x[n]);
double Jacobi(int i,int j,double x[n]);
double max(double x[n],double Xprev[n]);
x[0]=0.00000001; //pochatkove
x[1]=0.00000001; //nablyzhennya
m=0;
do
{
for(i=0;i<=n-1;i++)
Xprev[i]=x[i];
//----------FORMUYEMO F TA J------------------------
for(i=0;i<=n-1;i++)
{
F[i]=f(i,x);
for(j=0;j<=n-1;j++)
J[i][j]=Jacobi(i,j,x);
}
//--------------------------------------------------
for(i=0;i<=n-1;i++)
for(j=0;j<=n-1;j++)
a[i][j]=J[i][j];
a[0][n]=F[0];
a[1][n]=F[1];
//------------- GAUSS PO STOVPTSYAH----------------------
for(L=0;L<=n-2;L++)
{
for(k=L+1;k<=n;k++)
{
a[L][k]=-a[L][k]/a[L][L];
for(i=L+1;i<=n-1;i++)
a[i][k]=a[i][k]+a[i][L]*a[L][k];
}
}
// ------ZVOROTNIY HID-------
deltaX[n-1]=-a[n-1][n]/a[n-1][n-1];
for(i=n-2;i>=0;i--)
{
deltaX[i]=a[i][n];
for(k=i+1;k<=n-1;k++)
deltaX[i]+=a[i][k]*deltaX[k];
}
for(i=0;i<=n-1;i++)
x[i]+=deltaX[i]; //--UTOCHNENE ZNACHENNYA x[i]--
m++;
}
while(max(x,Xprev)>E);
printf("\t ---ROZVYAZOK SYSTEMY---\n\t| (ZA %d ITERATSII): |\n",m);
for(i=0;i<=n-1;i++)
printf("\t| x[%d]= %lf |\n",i,x[i]);
printf("\t -----------------------");
printf("\nPEREVIRKA_1!!! %lf\n",-x[0]+x[0]*x[0]-x[1]*x[1]-0.1);
printf("PEREVIRKA_2!!! %lf\n",-x[1]+2*x[0]*x[1]-0.1);
getch();
}
double f(int i,double x[n])
{
if(i==0)
return -x[0]+x[0]*x[0]-x[1]*x[1]-0.1;
else
return -x[1]+2*x[0]*x[1]-0.1;
}
double Jacobi(int i,int j,double x[n])
{
const double h=1e-9;
double prev=f(i,x);
x[j]+=h;
return (f(i,x)-prev)/h;
}
double max(double x[n],double Xprev[n])
{
int i;
double z,q;
z=fabs((x[0]-Xprev[0])/Xprev[0]);
for(i=1;i<=n-1;i++)
{
q=fabs((x[i]-Xprev[i])/Xprev[i]);
if(q>z)
z=q;
}
return z;
}
|
|
|

01.02.2009, 18:00
|
|
Постоянный
Регистрация: 15.06.2008
Сообщений: 941
Провел на форуме: 5111568
Репутация:
2399
|
|
модифицирований метод Ейлера
C:
Код:
#include <stdio.h>
#include <math.h>
#include <conio.h>
#define n 2
#define pi 3.14159265
void main(void)
{
int i;
double x,a,b,h,y[n],yn[n],yz[n];
double dy(int i,double x,double y[n]);
double modyficEYLER(int i,double h,double x,double y[n],double yz[n]);
a=pi/4;
b=pi/3;
h=0.026;
x=a;
y[0]=0.0;
y[1]=2.0;
printf("x= %lf\ty[1]= %lf\ty[2]= %lf\n",x,y[0],y[1]);
do
{
printf("x= %lf\t",x+h);
for(i=0;i<=n-1;i++)
{
yz[i]=y[i];
yn[i]=modyficEYLER(i,h,x,y,yz);
printf("y[%d]= %lf\t",i+1,yn[i]);
}
printf("\n");
for(i=0;i<=n-1;i++)
y[i]=yn[i];
x+=h;
}
while(x<=(b-h));
printf("\n");
getch();
}
double dy(int i,double x,double y[n])
{
if(i==0)
return y[1];
else
return -4*y[0]+8*(1/tan(2*x));
}
double modyficEYLER(int i,double h,double x,double y[n],double yz[n])
{
yz[i]=yz[i]+h*dy(i,x,yz);
return y[i]+0.5*h*( dy(i,x,y)+dy(i,x+h,yz) );
}
|
|
|

01.02.2009, 18:01
|
|
Постоянный
Регистрация: 15.06.2008
Сообщений: 941
Провел на форуме: 5111568
Репутация:
2399
|
|
интегрирование функции методо прямоугольников
pascal:
Код:
program lab4_11v;
uses Crt;
const a = 0;
b = 3;
E = 0.001;
function arcsin(x:real):real;
begin
if x=1.0 then
arcsin := Pi/2.0
else
arcsin := arctan(x/sqrt(1-x*x));
end;
function f(x:double):double;
begin
f:= arcsin(sqrt(x/(1+x)));
end;
var
S, h,n,M, x,Xn,I : double;
begin
ClrScr;
M := 0.05413; {max|f''(x)|}
h := sqrt( (24*E) / ((b-a)*M) ); {krok}
n := (b-a)/h; {4aCTuH}
S := 0;
x := a;
repeat
begin
Xn := x+h;
S := S + f((x+Xn)/2);
x := Xn;
end;
until (Xn <= (b-h));
I:= h * S;
writeln('I = ',I:5:5);
readln;
end.
|
|
|

01.02.2009, 18:24
|
|
Познавший АНТИЧАТ
Регистрация: 01.06.2008
Сообщений: 1,047
Провел на форуме: 5321514
Репутация:
3313
|
|
eLWAux, double объявляй как static или global... В стэке нельзя большие массивы хранить, а то будет stack overflow!
|
|
|

01.02.2009, 18:37
|
|
Постоянный
Регистрация: 15.06.2008
Сообщений: 941
Провел на форуме: 5111568
Репутация:
2399
|
|
Сообщение от Chaak
В стэке нельзя большие массивы хранить, а то будет stack overflow!
спасибо за ошибку (:
// программа расчитана на небольшие системи уравнений
// т.е. и на небольшие массиви
// если у вас >100 уравнений, тогда всюда перед обьявлением массива допишите global ..или static
|
|
|

01.02.2009, 21:45
|
|
Познавший АНТИЧАТ
Регистрация: 01.12.2006
Сообщений: 1,769
Провел на форуме: 3718311
Репутация:
1118
|
|
Просили накатать лабу по генератору пассвордов
Вот ложу еще и сюда исходники, вдруг кому надо будет.
Написано с ходу и без особого энтузиазма, кому что не нравиться переделывайте сами
http://depositfiles.com/files/uc1fnf6qt
С сохранением в файл (попросили дописать)
http://depositfiles.com/files/tcqqnia0d
2Модераторы
Звыняюсь если нарушаю но задолбали ПМ-ить , поступайте как знаете.
Последний раз редактировалось POS_troi; 02.02.2009 в 00:57..
|
|
|

02.02.2009, 11:16
|
|
Познавший АНТИЧАТ
Регистрация: 19.07.2005
Сообщений: 1,000
Провел на форуме: 5868159
Репутация:
950
|
|
Просили написать софт по решению нелинейных уравнений методом итерации.
С меня +
|
|
|

03.02.2009, 05:24
|
|
Новичок
Регистрация: 18.01.2009
Сообщений: 23
Провел на форуме: 31952
Репутация:
9
|
|
Помогите с курсачом.
Прога на Си.
Имеется граф надо найти количество компонент связанности в дополнениии заданного графа.
Ребра графа дополнения я уже нашел осталось тольок найти сколько в графе который состоит из найденных ребер компонент связанности.
Вот такой вот сломаймозг.
-----------------------------------
to cardons:
http://slil.ru/26609953
К обеду мож прога буит.
-----------------------------вот прога к методичке
/* Lab3 28203 */
#include <stdio.h>
#include <math.h>
#include <conio.h>
main()
{
int n=0;
float x,y,z,c,a,b,x0=1,y0=1,eps=0.001;
x=x0; y=y0;
textcolor(90+1);
clrscr();
puts("n x(k) x(k+1) X(k+1)-X(k) y(k) y(k+1) |Y(k+1)-Y(k)|");
do
{
a=x+(x*x+y-6)-(x+y-4);
b=y+(x*x+y-6)-2*(x+y-4);
//a=(2*x-3*x+2)/1-2*x;
//b=(2*x*x*x-13*x)/1-2*x;
z=x; c=y;
printf("|%d| %.4f| %.4f| %.4f| %.4f| %.4f| %.4f| \n",n++,x,a,fabs(a-x),y,b,fabs(b-y));
x=a; y=b;}
while(fabs(z-x)>eps || fabs(c-y)>eps);
getch();
return 0;
}
Последний раз редактировалось venom_aerocore; 10.02.2009 в 01:06..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|