пятница, 11 февраля 2011 г.

Примеры решения систем дифференциальных уравнений

В документе собраны примеры и алгоритмы решения систем дифференциальных уравнений различными способами.
1) Нахождение частного решения системы.
2) План решения системы методом Эйлера.
3) Общее решение системы методом Эйлера.
4) Решение задачи Коши.
5) Решение системы методом исключения.
6) Решение системы методом интегрируемых комбинаций.

четверг, 3 февраля 2011 г.

Строим простой график в C#

Пришло время на практике ознакомиться с библиотекой ZedGraph. Построим график простейшей функции y=x^2
Создаём новый проект приложения Windows Forms. На панель элементов необходимо добавить компонент ZedGraph, для этого на панели элементов создаём новую вкладку ZedGraph, щёлкаем по ней правой кнопкой мыши и выбираем пункт меню  Выбрать элементы...

Нажимаем по кнопке Обзор и указываем путь к файлу библиотеки ZedGraph.dll
На форме программы  размещаем компонент ZedGraph и кнопку Button
Для кнопки пишем обработчик:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ZedGraph;//подключаем ZedGraph

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Dictionary<double, double> coordinats = new Dictionary<double, double>();// coordinats-хранит координаты точек функции
            for (double x = -9; x <= 9; x += 0.1)//x от -9 до 9
            {
                coordinats.Add(x, x * x);//расчитываем координаты
            }
            GraphPane myPane = new GraphPane();
            zedGraphControl1.GraphPane = myPane;
            myPane.XAxis.Title.Text = "Координата X";//подпись оси X
            myPane.YAxis.Title.Text = "Координата Y";//подпись оси Y
            myPane.Title.Text = "График функции y=x^2";//подпись графика
            myPane.Fill = new Fill(Color.White, Color.LightSkyBlue, 45.0f);//фон графика заливаем градиентом
            myPane.Chart.Fill.Type = FillType.None;
            myPane.Legend.Position = LegendPos.Float;
            myPane.Legend.IsHStack = false;
            LineItem myCurve = myPane.AddCurve("y=x^2",coordinats.Keys.ToArray(), coordinats.Values.ToArray(), Color.Blue,SymbolType.None);//строим график, цвет линии синий
            myCurve.Symbol.Fill = new Fill(Color.White);
            zedGraphControl1.AxisChange();
            zedGraphControl1.Refresh();
            zedGraphControl1.Visible = true;
        }
    }
}
В результате получим следующую программу:

среда, 2 февраля 2011 г.

Рисование графиков в C#

Очень часто на практике возникает задача отобразить график в окне программы. Можно конечно попытаться рисовать график вручную, используя методы рисования по форме, но гораздо удобнее использовать готовые компоненты. Например, существует замечательная бесплатная библиотека ZedGraph. Она является бесплатной и обладает широкими возможностями, о которых мы поговорим в следующих статьях.
 Скачать  последнюю версию библиотеки можно по ссылке

вторник, 25 января 2011 г.

Математические шуточки ко Дню студента

Проще некуда
Первоклассник спрашивает у отца-математика:
— Пап, я забыл, как пишется восьмерка.
— Это проще простого, сынок, — отвечает тот. — Берешь знак бесконечности и поворачиваешь на пи пополам.

Как ловят слона математики
1. Неопытный математик едет в Африку, устраняет все, что не является слоном, а затем ловит слона как разницу вычитания.
2. Опытный математик сначала попытается доказать, что слоны существуют, и только после этого приступит к его поимке (см. пункт 1).
3. Профессор математики доказывает существование хотя бы одного слона, после чего перекладывает охоту на своих студентов.

Прикладная математика
Профессор математики встречает бывшего студента и после недолгого разговора спрашивает:
— Мне интересно, пригодилось ли тебе что-нибудь из моих лекций? Если пригодилось — расскажи, я хоть буду знать, что не зря работал.
Студент отвечает:
— Еще как пригодилось! Однажды в туалете у меня часы соскользнули с руки и упали в унитаз. Ну, я не растерялся, вспомнил, чему вы нас учили на лекциях, согнул кусок проволоки в виде интеграла и достал часы.

Не растерялся
Экзамен по математическому анализу. Студент не может толком ответить ни на один вопрос. Потеряв терпение, профессор начинает кричать:
— Это полная чушь! Такое мог сказать только осел!
И, обращаясь к одному из ассистентов, иронически просит:
— Принесите мне охапку сена!
Студент тут же добавляет:
— А мне чашечку кофе, пожалуйста.

воскресенье, 23 января 2011 г.

Шпаргалка по высшей математике на телефон (JAVA-приложение)

Данная Java-шпаргалка оснащена поиском и выбором раздела. Также можно менять размер шрифта и мгновенно отключать подсветку. Очень поможет при сдаче экзамена по высшей математике ;)
Содержание:
Определители. Основные определения. Вычисление определителей третьего порядка.
Свойства определителей.
Минор.
Алгебраическое дополнение.
Вычисление определителей любого порядка. Понятие определителя n-ого порядка.
Матрицы. Основные определения.
Операции над матрицами.
Понятие обратной матрицы и алгоритм её вычисления. Ранг матрицы. Элементарные преобразования.
Системы линейных алгебраических уравнений. Основные определения. Матричная форма записи.
Правило Крамера.
Теорема Кронекера-Капелли.
Решение систем линейных алгебраических уравненийий методом Гаусса.
Матричный метод решения системы линейных алгебраических уравнений.
Однородная система линейных алгебраических уравнений.
Скалярные и векторные величины. Основные определения.
Линейные операции над векторами. Свойства линейных операций.
Векторное пространство, его размерность. Понятие Базиса.
Базис на плоскости. Разложение вектора по базису R.
Базис в пространстве. Разложение вектора по базису R.
Скалярное произведение векторов. Свойства скалярного произведения.
Определение угла между двумя векторами.
Условия параллельности(коллинеарности) и перпендикулярности(ортогональности) двух векторов.
Векторное произведение.
Свойства векторного произведения.
Векторное произведение ортов.
Смешанное произведение векторов. Свойства смешанного произведения. Геометрический смысл смешанного произведения.
Координаты на прямой. Деление отрезка в данном отношении.
Общее уравнение прямой и его исследование.
Уравнение прямой, проходящей через две точки М 1(x1, y1) М2 (x2, y2).
Уравнение прямой в отрезках.
Уравнение прямой с угловым коэффициентом.
Нормальное уравнение плоскости.
Условие параллельности и перпендикулярности прямых.
Угол между прямыми.
Плоскость в пространстве. Виды уравнений плоскости.
Прямая в пространстве. Виды уравнений прямой в пространстве.
Взаимное расположение прямой и плоскости.
Кривые второго порядка. Окружность.
Кривые второго порядка. Эллипс.
Кривые второго порядка. Гипербола.
Кривые второго порядка. Парабола.

Скачать

среда, 19 января 2011 г.

Устранение недостижимых состояний любого конечного автомата

Написать программу, реализующую устранение недостижимых состояний любого конечного автомата (предусмотреть введение произвольного множества нетерминалов, входных символов, начального и конечного состояний и правил перехода. Правила перехода можно хранить в двумерном массиве).

Рассмотрим алгоритм устранения недостижимых состояний. Алгоритм состоит в следующем.
Вход: КА .
Выход: КА без недостижимых состояний.
1. Поместить начальное состояние КА в список достижимых состояний.
2. Для новых элементов списка достижимых состояний пополнить список группой их состояний-преемников, отсутствующих в списке.
3. Повторять п.2, пока список достижимых состояний не перестанет меняться.
4. Исключить из множества состояний КА все состояния, отсутствующие в списке достижимых состояний.
5. Исключить недостижимые заключительные состояния и функции переходов, содержащие недостижимые состояния.
Программная реализация на языке C++

#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char *argv[])
{
    fstream read,write;//поток для чтения/записи из файла
    read.open("avtomat.txt",ios::in);//открываем файл avtomat.txt
    write.open("avtomat_.txt",ios::out);//открываем файл avtomat_.txt
    if(!read||!write){cout<<"File read Error!"<<endl;system("PAUSE");return EXIT_SUCCESS;};//если возникла ошибка при чтении
    char sostoanie[128],start,end[128],dost[128],nedost[128]={}; //sostoanie-состояния,start - начальное состояние, end - конечные состояния, stroka - строка для распознавания//dost - достижимые состояния
    int razmer,c=1,flag; //razmer - количество правил
    read.getline(sostoanie,128,'\n');cout<<sostoanie<<endl;//считали множество состояний
    read>>start;read.get();cout<<"Start "<<start<<endl;
    read.getline(end,128,'\n');cout<<"Finish "<<end<<endl;//считали конечные состояния
    read>>razmer;read.get(); //считали количество правил
    char pravila[3][razmer],temp[4];//pravila массив с правилами, temp промежуточный массив для чтения правил
    dost[0]=start;//начальное состояние всегда достижимо *1 ШАГ АЛГОРИТМА*
    for(int i=0;i<razmer;i++)//считываем правила
    {
           read.getline(temp,4,'\n');cout<<temp<<endl;
           for(int j=0;j<3;j++)
                   pravila[j][i]=temp[j];               
    };
    //ищем достижимые состояния
    for(int i=0;i<strlen(sostoanie);i++)
    {
       for(int k=0;k<razmer;k++)            
          if(sostoanie[i]==pravila[2][k]&&pravila[0][k]!=pravila[2][k]&&sostoanie[i]!=start)
             {
                dost[c]=sostoanie[i];c++;break;
              }
   }
   //находим недостижимые состояния
   c=0;
   for(int i=0;i<strlen(sostoanie);i++)
   {
           flag=0;
   for(int k=0;k<strlen(dost);k++)            
          if(sostoanie[i]!=dost[k])
             {
               flag++;
              } 
           if(flag==strlen(dost))
           {
             nedost[c]=sostoanie[i];c++; 
           }       
  }
  cout<<endl<<"=========="<<endl<<"Nedostigimue sostoania "<<nedost<<endl<<"=========="<<endl;
  write<<dost<<endl<<start<<endl;//записываем в новый файл новые состояния и начальное состояние
  cout<<dost<<endl<<"Start "<<start<<endl;
  for(int i=0;i<strlen(end);i++)//исключаем из конечных состояний недостижимые
  for(int j=0;j<strlen(nedost);j++)
  if(end[i]!=nedost[j])
  {
     cout<<"Finish "<<end[i]<<endl;
     write<<end[i];//записываем конечные состояния в новый файл
  }
  for(int i=0;i<razmer;i++)//исключаем из правил правила с недостижимыми состояниями
  for(int j=0;j<strlen(nedost);j++)
  if(pravila[0][i]!=nedost[j]&&pravila[2][i]!=nedost[j])
  {
     cout<<pravila[0][i]<<pravila[1][i]<<pravila[2][i]<<endl;
     write<<endl<<pravila[0][i]<<pravila[1][i]<<pravila[2][i];//записываем новые правила в файл
  }
  system("PAUSE");return EXIT_SUCCESS;
}

понедельник, 17 января 2011 г.

Копирование папок с подпапками на WinAPI

Программа, позволяющая переместить целиком любой каталог (с вложенными подкаталогами).
Имя исходного каталога и каталога назначанеия программа получает через командную строку.
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;

//indir - откуда копировать
//outdir - куда копировать
BOOL Copy(char indir[128],char outdir[128])
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
CreateDirectory(outdir, NULL);//создаём директорию куда всё будем копировать
char maska[128] = {0};
strcat(maska,indir);strcat(maska,"/*");//Где какие файлы ищем
hFind = FindFirstFile(maska, &FindFileData);//Поиск файлов
if(hFind == NULL) return FALSE;

do
{

if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)// нашли папку
{
if(strcmp(FindFileData.cFileName,".")&&strcmp(FindFileData.cFileName,".."))
{
printf ("Copy Directory  %s\n", FindFileData.cFileName);
char indir2[128]={0};char outdir2[128]={0};
strcat(indir2,indir);strcat(indir2,"/");strcat(indir2,FindFileData.cFileName);strcat(indir2,"/");
strcat(outdir2,outdir);strcat(outdir2,"/");strcat(outdir2,FindFileData.cFileName);
Copy(indir2,outdir2);//рекурсивный вызов функции
}
}
else//нашли файл
{
printf ("Copy File  %s\n", FindFileData.cFileName);
char indir2[128]={0};char outdir2[128]={0};
strcat(indir2,indir);strcat(indir2,"/");strcat(indir2,FindFileData.cFileName);
strcat(outdir2,outdir);strcat(outdir2,"/");strcat(outdir2,FindFileData.cFileName);
CopyFile (indir2,outdir2, TRUE);//копируем файл
}
}
while(FindNextFile(hFind, &FindFileData));//пока есть что копировать
FindClose(hFind);
return TRUE;
}


int main(int argc, char *argv[])
{
Copy(argv[1],argv[2]);
getch();
return 0;
}