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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2011, 20:49   #1
lot555
Пользователь
 
Регистрация: 01.03.2010
Сообщений: 10
Лампочка Нужно найти ошибку в коде (C++)

Код:
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

const int n = 2;

inline float f1(float x)
{
       return (cos(x - 1.5) - 0.7) / (-1.2);
}

inline float f2(float x)
{
       return 3 + cos(x - 2.3);
}

void rlsu(float a[][2], float *b, float n)
{
    int i, j, k;
    float c, max, maxi;
    
    for(k = 0; k < n;k++)
    {
          max = fabs(a[k][k]);
          maxi = k;
          for(j = k; j < n; j++)
          {
              if(fabs(a[j][k]) > max)
              {
                  max = fabs(a[j][k]);
                  maxi = j;
              }
          }
          
          if((int)maxi != k)
          {
              for(j = 0; j < n; j++)
              {
                  c = a[k][j];
                  a[k][j] = a[(int)maxi][j];
                  a[(int)maxi][j] = c;
              }
          }
          
          c = 1 / a[k][k];
          
          for(j = k; j < n; j++)
          {
              a[k][j] *= c;
          }
          b[k] *= c;
          
          for(i = k + 1; i < n; i++)
          {
              for(j = k + 1; j < n; j++)
              {
                  a[i][j] -= a[i][k] * a[k][j];
              }
              
              b[i] -= a[i][k] * b[k];
          }
    }
    
    for(k = (int)n - 2; k >= 0; k--)
    {
        for(j = k + 1; j < n; j++)
        {
            b[k] -= a[k][j] * b[j];
        }
    }
}

void fn(float *x, float df[][n], float *f)
{ 
     f[0] = -(cos(x[0] - 1.5) + 1.2 * x[1] - 0.7);
     f[1] = -(x[0] - cos(x[1] - 2.3) - 3);
     df[0][0] = -sin(x[0] - 1.5);
     df[0][1] = 1.2;
     df[1][0] = 1;
     df[1][1] = sin(x[1] - 2.3); 
}

int rsnu(float *x, float df[][n], float *f, int n, float eps, int it)
{
    int i, k, error;
    if(n < 2)
         return 2;
         
    for(k = 1; k <= it; k++)
    {
        fn(x, df, f);
        rlsu(df, f, n);
        error = 0;
        
        for(i = 0; i < n; i++)
        { 
          x[i] += f[i];
          
          cout << f[i] << endl;
          if(fabs(f[i]) > eps)
              error = 1;
        }
        if (error == 0) 
            return 0;
    }
    
    return 1;
}

main()
{
    const int it = 30;
    float eps = 1e-3;
    float x[n], df[n][n], f[n];
    
    int i, error;
    char s[] = {"Enter the approximate x:\0"}, s1[10];
    int k = strlen(s);
    
    cout << "Enter the approximate x1: ";
    cin >> x[0];
    cout << "Enter the approximate x2: ";
    cin >> x[1];
    
    error = rsnu(x, df, f, n, eps, it);
    
    if(error == 2) 
        /*outtextxy(4, 16, */cout << "Mistype the number of equations."/*)*/;
        
    if(error == 1) 
        /*outtextxy(4, 16, */cout << "Solution is not obtained within " << it << " iterations"/*)*/;
        
    if(error == 0)
    {
        for(i = 0; i < n; i++)
        {
              if(i == 0)
              { 
                   s[0] = '\0';
                   strcat(s, "x = ");
                   gcvt(x[i], 7, s1);
                   strcat(s, s1);
                   strcat(s, " "); 
              }
              else
              {
                  strcat(s, "y = ");
                  gcvt(x[i], 5, s1);
                  strcat(s, s1);
                  /*outtextxy(4, 16, */cout << s/*)*/; 
              }
        }
    }
    
    getch();
    return 0;
}
Суть задачи
Решить систему нелинейного уравнения методом Ньютона
Сами уравнения:
cos(x - 1.5) + 1.2 * y = 0.7
x - cos(y - 2.3) = 3

Программа пишет
"Solution is not obtained within 30 iterations"
А должна:
Ответ: x=2.367439, y=0.0044349.

В чём ошибка понять не могу, помогите
lot555 вне форума Ответить с цитированием
Старый 26.05.2011, 21:00   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Решение не получено в пределах 30 итераций
Нарушены пареметры какого-то из циклов.
Мы здесь не "решатели проблемм", мы "программёры".
Локализуй поблемму и выставляй, а то я ща выложу код в 20000 строк и спрошу, а в чём прооблемма? И каков будет ответ, в лучшем случае - молчание.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 26.05.2011, 21:24   #3
lot555
Пользователь
 
Регистрация: 01.03.2010
Сообщений: 10
По умолчанию

Рабочий вариант
Код:
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

const int n = 2;

inline float f1(float x)
{
       return (cos(x - 1.5) - 0.7) / (-1.2);
}

inline float f2(float x)
{
       return 3 + cos(x - 2.3);
}

void rlsu(float a[][2], float *b, float n)
{
    int i, j, k;
    float c, max, maxi;
    
    for(k = 0; k < n;k++)
    {
          max = fabs(a[k][k]);
          maxi = k;
          for(j = k; j < n; j++)
          {
              if(fabs(a[j][k]) > max)
              {
                  max = fabs(a[j][k]);
                  maxi = j;
              }
          }
          
          if((int)maxi != k)
          {
              for(j = 0; j < n; j++)
              {
                  c = a[k][j];
                  a[k][j] = a[(int)maxi][j];
                  a[(int)maxi][j] = c;
              }
          }
          c = b[k];
          b[k] = b[(int)maxi];
          b[(int)maxi] = c;
          c = 1 / a[k][k];
          
          for(j = k; j < n; j++)
          {
              a[k][j] *= c;
          }
          b[k] *= c;
          
          for(i = k + 1; i < n; i++)
          {
              for(j = k + 1; j < n; j++)
              {
                  a[i][j] -= a[i][k] * a[k][j];
              }
              
              b[i] -= a[i][k] * b[k];
          }
    }
    
    for(k = (int)n - 2; k >= 0; k--)
    {
        for(j = k + 1; j < n; j++)
        {
            b[k] -= a[k][j] * b[j];
        }
    }
}

void fn(float *x, float df[][n], float *f)
{ 
     f[0] = -(cos(x[0] - 1.5) + 1.2 * x[1] - 0.7);
     f[1] = -(x[0] - cos(x[1] - 2.3) - 3);
     df[0][0] = -sin(x[0] - 1.5);
     df[0][1] = 1.2;
     df[1][0] = 1;
     df[1][1] = sin(x[1] - 2.3); 
}

int rsnu(float *x, float df[][n], float *f, int n, float eps, int it)
{
    int i, k, error;
    if(n < 2)
         return 2;
         
    for(k = 1; k <= it; k++)
    {
        fn(x, df, f);
        rlsu(df, f, n);
        error = 0;
        
        for(i = 0; i < n; i++)
        { 
          x[i] += f[i];
          
          cout << f[i] << endl;
          if(fabs(f[i]) > eps)
              error = 1;
        }
        if (error == 0) 
            return 0;
    }
    
    return 1;
}

main()
{
    const int it = 30;
    float eps = 1e-6;
    float x[n], df[n][n], f[n];
    
    int i, error;
    char s[] = {"Enter the approximate x:\0"}, s1[10];
    int k = strlen(s);
    
    cout << "Enter the approximate x1: ";
    cin >> x[0];
    cout << "Enter the approximate x2: ";
    cin >> x[1];
    
    error = rsnu(x, df, f, n, eps, it);
    
    if(error == 2) 
        /*outtextxy(4, 16, */cout << "Mistype the number of equations."/*)*/;
        
    if(error == 1) 
        /*outtextxy(4, 16, */cout << "Solution is not obtained within " << it << " iterations"/*)*/;
        
    if(error == 0)
    {
        for(i = 0; i < n; i++)
        {
              if(i == 0)
              { 
                   s[0] = '\0';
                   strcat(s, "x = ");
                   gcvt(x[i], 7, s1);
                   strcat(s, s1);
                   strcat(s, " "); 
              }
              else
              {
                  strcat(s, "y = ");
                  gcvt(x[i], 5, s1);
                  strcat(s, s1);
                  /*outtextxy(4, 16, */cout << s/*)*/; 
              }
        }
    }
    
    getch();
    return 0;
}
если кому пригодится
Целых 3 строки пропустил
lot555 вне форума Ответить с цитированием
Старый 26.05.2011, 23:04   #4
Biggs
Пользователь
 
Регистрация: 15.07.2010
Сообщений: 74
По умолчанию

i
Цитата:
if(fabs(f[i]) > eps)
error = 1;
Выясни почему у тебя error=1
Biggs вне форума Ответить с цитированием
Старый 27.05.2011, 09:05   #5
lot555
Пользователь
 
Регистрация: 01.03.2010
Сообщений: 10
По умолчанию

Это для того, чтобы если x или y больше заданного эпсилон, то повторяем цикл, если же меньше то выходим и говорим ответ.
ну а если на 30-тую итерацию error = 1 будет то скажем что за 30 итераций корни найдены не были, возможно нужно больше )
Ну по крайней мере программа теперь вычисляет правильно )
lot555 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно исправить ошибку в коде Bright-rider Фриланс 2 07.04.2011 13:14
Таймер обратного отсчета работает не так как надо.. нужно найти ошибку в коде... Человек_Борща Общие вопросы Delphi 10 13.04.2010 20:06
Нужно найти ошибку в коде Вован111 Помощь студентам 15 08.11.2009 14:33
Не могу найти ошибку в коде! Natasha666 Помощь студентам 1 20.05.2009 09:27
Помогите найти ошибку в коде C++ Жека:) Помощь студентам 15 29.10.2008 11:32