-Поиск по дневнику

Поиск сообщений в rss_forum_sources_ru

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.07.2007
Записей:
Комментариев:
Написано: 80


Не выводится столбец ошибок в текстовый файл при реализации модели изинга

Пятница, 19 Марта 2021 г. 15:54 + в цитатник
DaniilNakhodka1995: Здравствуйте! Помогите, пожалуйста, найти ошибку в коде. При выполнении программы создается текстовый документ(вообще 3, но интересуют только два из них, Efull.txt и M.txt) и туда записывается, например, в Efull.txt, столбец значений T, столбец Efull и третий столбец с ошибками. Первые два столбца вроде как заполняются нормально, а третий заполнен каждый раз нулями. Это лабораторная работа в универе, сравнивал с другими работами, с готовыми, там все примерно то же самое, но файлы правильно заполняются. Уже много разных изменений в код добавлял, но ничего не меняется. Ошибка вычисляется в функции double er(double *xi, double x) строка 112. Вызов функции происходит в строках 182 и 186, а печать в файл - 184 и 188.

    #include
    #include
    #include
    #include
    #include
    #include
    using namespace std;
    void array(int n, int **arr)
    {
    for(int i=0; idiv>
    {
    for(int j=0; jdiv>
    {
    arr[i][j]=rand()%2;
    if(arr[i][j]==0)
    {
    arr[i][j]=-1;
    }
    cout<div>
    }
    cout<div>
    }
    }
    void sosedi(int i, int j, int n, int *s, int **arr)
    {
    if(i==0)
    {
    s[0]=arr[n-1][j];
    }
    else
    {
    s[0]=arr[i-1][j];
    }
    if(i==n-1)
    {
    s[1]=arr[0][j];
    }
    else
    {
    s[1]=arr[i+1][j];
    }
    if(j==0)
    {
    s[2]=arr[i][n-1];
    }
    else
    {
    s[2]=arr[i][j-1];
    }
    if(j==n-1)
    {
    s[3]=arr[i][0];
    }
    else
    {
    s[3]=arr[i][j+1];
    }
    }
    double e1sp(int i, int j, int n, int **arr)
    {
    double sum=0.0;
    int s[4];
    sosedi(i, j, n, s, arr);
    for(int a=0; a<4; a++)
    {
    sum+=arr[i][j]*s[a];
    }
    return (-1)*sum;
    }
    double poles(int n, int **arr)
    {
    double sum=0.0;
    for(int i=0; idiv>
    {
    for(int j=0; jdiv>
    {
    sum+=e1sp(i, j, n, arr);
    }
    }
    return sum/(n*n);
    }
    double sreden(int n, int **arr)
    {
    return poles(n, arr)/(n*n);
    }
    double namag(int n, int **arr)
    {
    double sum=0.0;
    for(int i=0; idiv>
    {
    for(int j=0; jdiv>
    {
    sum+=arr[i][j];
    }
    }
    return fabs(sum/(n*n));
    }
    double tepl(double Esum1, double Esum2, double T){
    double Esr=0, Esrkv=0;
    Esr=Esum1/10;
    Esrkv=Esum2/10;
    return (Esrkv-(Esr*Esr))/(T*T);
    }
    double er(double *xi, double x){
    x/=10;
    double sum=0;
    for (int i=0; i<10; i++)
    {
    sum+=(xi[i]-x)*(xi[i]-x);
    }
    return sqrt((1/9)*sum);
    }
    int main()
    {
    int n=0;
    srand(time(0));
    ofstream Ef, Mf, Cf;
    cout<<"Vvedite n:";
    cin>>n;
    cout<div>
    int **arr=new int *[n];
    for (int i=0; idiv>
    {
    arr[i]=new int[n];
    }
    array(n, arr);
    cout<div>
    int i=rand()%n;
    int j=rand()%n;
    cout<<"Energia vibrannogo spina="<div>
    cout<<"Energia vsey sistemi="<div>
    cout<<"Namagnichennost vsey sistemi="<div>
    sreden(n, arr);
    double T, Efull=0.0, M=0.0, C=0.0, Esum1=0.0, Esum2=0.0;
    double Estep[10], Mstep[10], Cstep[10];
    double Msum=0.0, Csum=0.0;
    double Emist=0.0, Mmist=0.0, Cmist=0.0;
    Ef.open("Efull.txt");
    Mf.open("M.txt");
    Cf.open("C.txt");
    for(T = 0.01; T<4; T+=0.1)
    {
    for(int step=0; step<10; step++)
    {
    for(long int MK=0; MK<100000; MK++)
    {
    double E1=0.0, E2=0.0, p=0.0, slch=0.0;
    int i=rand()%n;
    int j=rand()%n;
    E1=e1sp(i, j, n, arr);
    arr[i][j]=(-1)*arr[i][j];
    E2=e1sp(i, j, n, arr);
    if(E2>=E1)
    {
    p=exp(((-1)*(E2-E1))/T);
    p*=100;
    slch=rand()%101;
    if(p>=slch)
    {
    arr[i][j]=(-1)*arr[i][j];
    }
    }
    }
    Efull=poles(n, arr);
    Estep[step]=Efull;
    Esum1+=Efull;
    Esum2+=(Efull*Efull);
    Mstep[step]=namag(n, arr);
    Msum+=Mstep[step];
    }
    cout<<"T="<div>
    Efull=poles(n, arr);
    Emist=er(Estep, Esum1);
    cout<<"E(T)="<div>
    Ef<div>
    M=namag(n, arr);
    Mmist=er(Mstep, Msum);
    cout<<"M(T)="<div>
    Mf<div>
    C=tepl(Esum1, Esum2, T);
    cout<<"C(T)="<div>
    Cf<div>
    }
    for(int i=0; idiv>
    {
    delete[] arr[i];
    }
    delete[] arr;
    Ef.close();
    Mf.close();
    Cf.close();
    }

https://forum.sources.ru/index.php?showtopic=421263&view=findpost&p=3845559

Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку