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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2021, 15:50   #1
DaniilNakhodka1995
Новичок
Джуниор
 
Регистрация: 19.03.2021
Сообщений: 3
По умолчанию Не выводится столбец ошибок в текстовый файл при реализации модели изинга

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

Код:
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <fstream>
#include <cmath>
#include <ctime>
using namespace std;

void array(int n, int **arr)
{
	for(int i=0; i<n; i++)
	{
		for(int j=0; j<n; j++)
		{
			arr[i][j]=rand()%2;
			if(arr[i][j]==0)
			{
				arr[i][j]=-1;
			}
			cout<<arr[i][j]<<"\t";
		}
		cout<<endl;
	}
}

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; i<n; i++)
	{
		for(int j=0; j<n; j++)
		{
			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; i<n; i++)
	{
		for(int j=0; j<n; j++)
		{
			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<<endl;
	int **arr=new int *[n];
	for (int i=0; i<n; i++)
	{
		arr[i]=new int[n];
	}
	array(n, arr);
	cout<<endl;
	int i=rand()%n;
	int j=rand()%n;
	cout<<"Energia vibrannogo spina="<<e1sp(i, j, n, arr)<<endl;
	cout<<"Energia vsey sistemi="<<poles(n, arr)<<endl;
	cout<<"Namagnichennost vsey sistemi="<<namag(n, arr)<<endl;
	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="<<T<<endl;
		Efull=poles(n, arr);
		Emist=er(Estep, Esum1);
		cout<<"E(T)="<<Efull<<endl;
		Ef<<T<<"\t"<<Efull<<"\t"<<Emist<<endl;
		M=namag(n, arr);
		Mmist=er(Mstep, Msum);
		cout<<"M(T)="<<M<<endl;
		Mf<<T<<"\t"<<M<<"\t"<<Mmist<<endl;
		C=tepl(Esum1, Esum2, T);
		cout<<"C(T)="<<C<<endl;
		Cf<<T<<"\t"<<C<<endl;
	}
    for(int i=0; i<n; i++)
	{
		delete[] arr[i];	
	} 
    delete[] arr;
    Ef.close();
    Mf.close();
    Cf.close();
}
DaniilNakhodka1995 вне форума Ответить с цитированием
Старый 19.03.2021, 16:06   #2
FrosyaZZ
Форумчанин
 
Регистрация: 16.11.2020
Сообщений: 243
По умолчанию

Код:
sqrt((1/9)*sum)
1/9 = 0 -> (1/9)*sum = 0 -> sqrt((1/9)*sum) = 0 -> er всегда возвращает 0
FrosyaZZ вне форума Ответить с цитированием
Старый 20.03.2021, 09:47   #3
DaniilNakhodka1995
Новичок
Джуниор
 
Регистрация: 19.03.2021
Сообщений: 3
По умолчанию

FrosyaZZ, спасибо, получилось)
DaniilNakhodka1995 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение формата при записи в текстовый файл mixt73 Общие вопросы по Java, Java SE, Kotlin 0 20.05.2014 12:30
Преобразовать текстовый столбец exсel в числовой Tip.the.besT Общие вопросы Delphi 6 01.03.2012 09:47