powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не выводится столбец ошибок в текстовый файл при реализации модели изинга
4 сообщений из 4, страница 1 из 1
Не выводится столбец ошибок в текстовый файл при реализации модели изинга
    #40055296
DaniilNakhodka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Помогите, пожалуйста, найти ошибку в коде. При выполнении программы создается текстовый документ(вообще 3, но интересуют только два из них, Efull.txt и M.txt) и туда записывается, например, в Efull.txt, столбец значений T, столбец Efull и третий столбец с ошибками. Первые два столбца вроде как заполняются нормально, а третий заполнен каждый раз нулями. Это лабораторная работа в универе, сравнивал с другими работами, с готовыми, там все примерно то же самое, но файлы правильно заполняются. Уже много разных изменений в код добавлял, но ничего не меняется. Ошибка вычисляется в функции double er(double *xi, double x) строка 112. Вызов функции происходит в строках 182 и 186, а печать в файл - 184 и 188.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
#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();
}
...
Рейтинг: 0 / 0
Не выводится столбец ошибок в текстовый файл при реализации модели изинга
    #40055299
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DaniilNakhodka return sqrt((1/9)*sum);

Скобки неправильно поставлены. 1/9 всегда равно 0. Отсюда и твои нули.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не выводится столбец ошибок в текстовый файл при реализации модели изинга
    #40055441
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще полезно писать 1.0 вместо 1, когда надо работать с float/double.
С точки зрения математики оно без разницы, и чаще всего компилятор это самостоятельно будет делать.

Но во первых, тебе самому будет проще потом понимать работаешь ты с целыми числами или (потенциально) дробными.

А во вторых, иногда компилятор может ошибиться. Например:
Код: plaintext
1.
2.
3.
4.
5.
for(int i=0; i<10; i++) {
    double x = i/2;
    double y = i/2.0;
    cout << "x=" << x << "   y=" << y << endl;
}
...
Рейтинг: 0 / 0
Не выводится столбец ошибок в текстовый файл при реализации модели изинга
    #40055451
DaniilNakhodka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо вам обоим, сделал вот так и получилось:

Код: plaintext
1.
2.
    double m=sum*0.11111111111;
    return sqrt(m);



Это вместо тех строк.
Теперь ошибка с графиками, тоже много всего с кодом перепробовал делать, на фото ниже самое лучшее, что получилось, но все равно не то. Посмотрите, пожалуйста, что может быть не так. Надо по выведенным в файлы значения построить графики в gnumplot и у меня получается так:
https://ibb.co/NNPLK7V
https://ibb.co/YZ746yn
https://ibb.co/dgT2DXH
https://ibb.co/hdJtDwP
https://ibb.co/8ryzMh6

А должно быть так:
https://ibb.co/S63mFM1
https://ibb.co/sjqyKnY
https://ibb.co/RhP3GZ1

Также, если кто знает, напишите, пожалуйста, как одновременно в gnuplot выводить 2 графика(lines и yerrorbars). На первых фото показан нужный мне вариант, а на моих все раздельно. Прописывал в gnuplot: plot "Путь к текстовому файлу" using 1:2:3 with lines/yerrorbars, но выводится только что-то одно, либо lines либо yerrorbars.

Сейчас код, с учетом всех последних изменений выглядит так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
#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]=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.0, Esrkv=0.0;
    Esr=Esum1/10;
    Esrkv=Esum2/10;
    double t=(Esrkv-(Esr*Esr))/(T*T);
    return t;
}

double er(double *xi, double x){
    x/=10.0;
    double sum=0.0;
    for (int i=0; i<10; i++)
	{
        sum+=(xi[i]-x)*(xi[i]-x);
    }
    double m=sum*0.11111111111;
    return sqrt(m);
}

int main()
{
	int n=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, C=0.0, Esum1=0.0, Esum2=0.0;
	double Est[10], Mst[10];
	double Msum=0.0, Csum=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 i=0; i<10; i++)
		{
			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);
		            slch=(double)rand()/(double)RAND_MAX;
	            	if(slch>p)
	            	{
	            		arr[i][j]=(-1)*arr[i][j];
		    		}
		    	}			 
		    }
            Est[i]=poles(n, arr);
            Esum1+=Est[i];
            Esum2+=(Est[i]*Est[i]);
            Mst[i]=namag(n, arr);
            Msum+=Mst[i];
		}
		cout<<"T="<<T<<endl;
		cout<<"E(T)="<<poles(n, arr)<<endl;
		Ef<<T<<"\t"<<poles(n, arr)<<"\t"<<er(Est, Esum1)<<endl;
		cout<<"M(T)="<<namag(n, arr)<<endl;
		Mf<<T<<"\t"<<namag(n, arr)<<"\t"<<er(Mst, Msum)<<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();
}



Массив специально генерируется только из единиц со знаком +, без -1, так советовал препод. Однако что с -1, что без -1, разницы особой нет, проверял.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не выводится столбец ошибок в текстовый файл при реализации модели изинга
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]