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

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

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

 

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

 -Статистика

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


Проблема с моделью изинга, находятся неправильные значения для графика

Суббота, 20 Марта 2021 г. 09:46 + в цитатник
DaniilNakhodka1995: Если что, я создал эту тему отдельно от прошлого своего вопроса, так как прошлый решен, а теперь возник новый. Помогите, пожалуйста. Теперь ошибка с графиками, много всего с кодом перепробовал делать, на фото ниже самое лучшее, что получилось, но все равно не то. Посмотрите, пожалуйста, что может быть не так. Надо по выведенным в файлы значения построить графики в 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.

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

    #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]=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.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<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, 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="<div>
    cout<<"E(T)="<div>
    Ef<div>
    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();
    }


Массив специально генерируется только из единиц со знаком +, без -1, так советовал препод. Однако что с -1, что без -1, разницы особой нет, проверял.

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

Метки:  

 

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

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

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

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