среда, 28 апреля 2010 г.

Нахождение корня функции.

Здесь описан метод половинного деления (дитохомии?). Суть проста. Есть функция f(x), есть интервал [a,b], есть условие, что на концах промежутка функция имеет разный знак: f(a)*f(b)<0. Требуется найти с заданной точностью eps корень этой функции. Поступаем так: выбираем середину отрезка [a,b]. Если в середине функция имеет тот же знак что и слева, то принимаем середину за новую левую границу, в противном случае - за правую. Повторяем до тех пор, пока отрезок не станет меньше eps. В данном примере в качестве функции берем синус, а отрезок - [3,4]. Таким образом мы должны найти число пи.

function f(x:real):real;
  begin
  f:=sin(x);
  end;
const MaxSteps=200;
var a0,b0,a,b,eps,fa,fb,t,ft:real;
    step,sa,sb:integer;
begin
writeln('Нахождение корней функции методом половинного деления:');
a0:=3; {writeln(' Input a0: ');readln(a0);}
b0:=4; {writeln(' Input b0: ');readln(b0);}
eps:=0.0000001; {writeln(' Input eps: ');readln(eps);}
fa:=f(a0); fb:=f(b0);
if (fa*fb>0) then
  begin
  writeln(' На заданном промежутке корней нет.');
  halt;
  end;
a:=a0; b:=b0;
step:=0; t:=a; ft:=fa;
while (abs(b-a)>eps) and (step<MaxSteps) do
  begin
  inc(step);
  t:=(a+b)/2;
  ft:=f(t);
  if (fa*ft>0) then
    begin
    fa:=ft;
    a:=t;
    end
  else
    b:=t;
  writeln('step:',step:4,' t=',t,' f(t)=',ft);
  end;
if (step>MaxSteps)
  then writeln('Отсутствие сходимости. Уточните промежуток.')
  else writeln('Найден корень с заданной точностью.');
end.

нахождения корней уравнения методом половинного деления



PROGRAM KORNI;
VAR A,B,PREC:REAL;
FUNCTION F(X:REAL):REAL;
BEGIN
 F:=X*X-3*X+2
END;
FUNCTION KORENJ(A,B,PREC:REAL):REAL;
VAR X,Y,Z:REAL;
BEGIN
 IF ABS(A-B)<PREC THEN KORENJ:=(A+B)/2
   ELSE BEGIN
   X:=F(A);
   Y:=F((A+B)/2);
   Z:=F(B);
   IF X*Y<0 THEN KORENJ:=KORENJ(A,(A+B)/2,PREC)
            ELSE KORENJ:=KORENJ((A+B)/2,B,PREC)
   END
END;
BEGIN
 READLN (A,B,PREC);
 WRITELN ('X=',KORENJ(A,B,PREC))
END.

вторник, 27 апреля 2010 г.

определитель матрицы

и снова определитель матрицы


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const int n = 4;

void print(int**, int);
void clear(int**, int**, int, int, int);
long Determinant(int**, int);

void main()
{
 time_t t;
 srand(time(&t));

 int** a = new int*[n];
 for (int i = 0; i < n; i++) a[i] = new int[n];


 for (int i = 0; i < n; i++)
 {
  for (int j = 0; j < n; j ++)
  {
   a[i][j] = rand() % 10;
  }
 }

 print(a, n);

 long dt = Determinant(a, n);
 printf("\nDeterminant = %d\n", dt);

 for (int i = 0; i < n; i++) delete[] a[i];
 delete[] a;
}

void print(int** a, int n)
{
 for (int i = 0; i < n; i++)
 {
  for (int j = 0; j < n; j++)
  {
   printf("%d\t", a[i][j]);
  }

  printf("\n");
 }
}

void clear(int** a, int** b, int m, int i, int j)
{
 int di = 0;
 int dj;

 for (int ki = 0; ki < m - 1; ki++)
 {
  if (ki == i)
   di = 1;

  dj = 0;
  for (int kj = 0; kj < m - 1; kj++)
  {
   if (kj == j)
    dj = 1;

   b[ki][kj] = a[ki + di][kj + dj];
  }
 }
}

long Determinant(int** a, int n)
{
 if (n == 1)
  return a[0][0];

 if (n == 2)
  return a[0][0] * a[1][1] - a[0][1] * a[1][0];

 int** b = new int*[n];
 for (int i = 0; i < n; i++) b[i] = new int[n];

 int d = 0;
 int k = 1;
   
 for (int i = 0; i < n; i++)
 {
  clear(a, b, n, i, 0);
  d += k * a[i][0] * Determinant(b, n - 1);
  k--;
 }

 for (int i = 0; i < n; i++) delete[] b[i];
 delete[] b;

 return d;
}

понедельник, 26 апреля 2010 г.

борьба с банерами от порно-информермеров

Конечно никто не хочет себе такие красОты, но когда они появляются, то хочется по скорее от них избавиться...

Наши Касперские и др. не спят и уже придумали генераторы кодов для снятия блокировок.

Здесь представлены генераторы кодов от разных производителей:

понедельник, 12 апреля 2010 г.

полезные скрипты для bash

замена переводов строк на запятую
$ awk '{printf $0","}' input.txt > output.txt

размер директории (заметьте - новый формат в системе CИ)
$ du --si