Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2011, 01:40   #1
Laplas
Пользователь
 
Регистрация: 02.10.2009
Сообщений: 25
По умолчанию уравнение sin-Гордона

Здравствуйте Форумчане! Помогите доделать код, задание такое: получить стационарное решение уравнеия син-Гордона в виде кинка(перегиба)..я вот тут написал по схеме Гордона:
Код:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<graphics.h>
#define K 0,5

int N,pg=0;
double *u,*u1,*u0,*tmp,a,b,c;
double dx,dt=1,t,maxT=1000;


//образующая функция
double f(double x)
{
    return (x-c*t)/sqrt(1-c*c);
/*
    if(x>-1+t && x<1+t)
       return 1;
    else
       return 0;
       */

 //      return sin(x+t);
}

//вычисление по схеме син-Гордона
void calculate()
{
    int j,i;
    //краевые условия
    u1[0]=u1[1];
    u1[N-1]=u[N-2];

    dt=K*dx;
    //теперь считаем
    for(j=1;j<N-1;j++)
        u1[j]=((u[j+1]-2*u[j]+u[j-1])/(dx*dx)+sin(u[j]))*dt*dt+(2*u[j]-u0[j]);

    //меняем массивы местами
    tmp=u0;
    u0 =u;
    u  =u1;
    u1 =tmp;
}


void draw()
{
    setactivepage(pg);
    pg=(pg+1)%2;
    setvisualpage(pg);

    cleardevice();
    setcolor(COLOR(0,255,0)); //зелёный
    //оси
    line(0,200,600,200);
    line(300,0,300,400);

    setcolor(COLOR(255,0,0)); //красный
    moveto(0,200);
    for(int j=0;j<N;j++)
    lineto(j*(600/N),200-u[j]*0.25);
}


void initGrid()
{
    int i;
    //краевые условия
    u[0]=u[1];
    u[N-1]=u[N-2];

    for(i=0;i<N;i++)
        u0[i]=f(a+dx*i);
    t+=dt;
    for(i=0;i<N;i++)
        u[i] =f(a+dx*i);
}


int main()
{
    int i;
    printf("input size of grid\n");
    scanf("%i",&N);

    //выделяем память
    u =(double *)calloc(N,sizeof(double));
    u1=(double *)calloc(N,sizeof(double));
    u0=(double *)calloc(N,sizeof(double));

    printf("input a b c\n");
    scanf("%lf %lf %lf",&a,&b,&c);

    dx=(b-a)/(N-1); //координатный шаг

    //теперь инициализируем
    initGrid();

    printf("input max time\n");
    scanf("%lf",&maxT);

/*
    printf("input step of time\napprox. %f for stability\n",dx);
    scanf("%lf",&dt);
*/

    initwindow(600,400);
    for(t=0;t<maxT;t+=dt)
    {
        calculate();
        draw();
    }
}
проблема в том,что он мне даже решение не хочет толком показывать(амплитуда графика маленькая), и явно видно, что решение не движется вдоль оси х, хотя должно..
помогите пожалуйста. язык С++

спасибо

Последний раз редактировалось Laplas; 26.01.2011 в 01:44.
Laplas вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
уравнение sin-Гордона Laplas Помощь студентам 1 25.12.2010 10:35
Что-то не то с Sin на Delphi Ybn2 Помощь студентам 6 18.12.2010 09:52
f(sin) в pascal A_Orlov Паскаль, Turbo Pascal, PascalABC.NET 1 27.04.2010 17:07
Оптимизация sin() на BASM InternetStranger Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 11.02.2010 00:56