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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2012, 20:11   #1
sinh
 
Регистрация: 16.09.2012
Сообщений: 7
По умолчанию Помогиет найти ошибку в коде.

Писал прогу по следующим алгоритмам, но результаты совершенно разные, хотя решают одну и туже задачу. На С++ пишу 1-й раз, подскажите, где допускаю ошибки.
Код:
#include "stdafx.h"
#include "math.h"
#include <iostream>
#include <stdio.h>
 
 
double signum(double a)
{
    if (a > 0)
        a = 1;
    if (a < 0)
        a = -1;
    if (a == 0)
        a = 0;
    return a;
}
 
double function(double x, double w)
{
    double f = sinh(w*x);
    return f;
}
 
double vegstein(double x_0, double w, double e)
{
    double x_1 = function(x_0, w);
    double x_00 = x_0;
    double x_11 = x_1;
    int k = 0;
    shag2:
    double x_2 = function(x_11, w);
    if (abs(x_2-x_11) > e)
        {
            double x_22 = (x_2 * x_00 - x_1 * x_11)/(x_2 + x_00 - x_1 - x_11);
            x_00 = x_11;
            x_1 = x_2;
            x_11 = x_22;
            k++;
            goto shag2;
        }
    else 
        {
            double ksi = x_2;
            std::cout << "ksi = " << ksi << "\n";
            std::cout << "k = " << k << "\n";
        }
    getchar();
    return 0;
}
 
double eitken(double x_0, double  w, double e)
{
    double x_1 = function(x_0, w);
    double x_2 = function(x_1, w);
    int k = 0;
    shag2:
    double x_22 = (x_0*x_2 - x_1*x_1)/(x_2-2*x_1+x_0);
    k++;
    double x_3 = function(x_22, w);
    if (abs(x_3-x_22) > e)
        {
            x_0 = x_22;
            x_1 = x_3;
            x_2 = function(x_1, w);
            goto shag2;
        }
    else 
        {
            double ksi = x_3;
            std::cout << "ksi = " << ksi << "\n";
            std::cout << "k = " << k << "\n";
        }
    getchar();
    return 0;
}
 
 
int main(int argc, _TCHAR* argv[])
{
    double x_0 = 1.0;
    double w = 0.5;
    double e = powl(10,-15);
    printf("Metod Vegsteina: \n");
    vegstein(x_0, w, e);
    printf("Metod Eitkena: \n");
    eitken(x_0, w, e);
    return 0;
}
Изображения
Тип файла: jpg bf044600edd1.jpg (84.1 Кб, 56 просмотров)
sinh вне форума Ответить с цитированием
Старый 16.09.2012, 21:21   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Код:
double signum(double a)
{
    if (a > 0)
        a = 1;
    if (a < 0)
        a = -1;
    if (a == 0)
        a = 0;
    return a;
}
можно заменить на:

Код:
double signum(double a)
{
    if (a!=  0)   a = a/fabs((float)a); 
    return a;
}
Но это так, к слову.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 16.09.2012 в 21:33.
Sciv вне форума Ответить с цитированием
Старый 16.09.2012, 21:48   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Если уж на то пошло, то сигнум лучше так записывать:
Код:
int signum (double a)
{
if (a > 0)
 return 1;
if (a < 0)
 return -1;
return 0;
}
Аналогично function можно в одну строчку, сразу ретурном без ввода лишней переменной.
Также goto по-хорошему бы заменить на цикл while. А для чисел с плавающей точкой надо использовать не abs, а fabs.
Навскидку несоответствий не нашел.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 16.09.2012, 21:58   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

А проблема у Вас, скорее всего, как раз в модулях чисел: функция abs применяется только с целочисленными аргументами, то есть abs(-5.5634)=abs(5)=5;

Нужно менять:

Код:
fabs((float)(x_2-x_11)) > e
и

Код:
fabs((float)(x_3-x_22))>e

UPD. Ну вот, уже и ответили
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 16.09.2012, 22:23   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Приводить к float-у необязательно (даже не стоит):
Код:
     double fabs (      double x );
      float fabs (       float x );
long double fabs ( long double x );
Ну и вообще тогда. Раз используете цпп-шные потоки, то зачем вам принтф? Выкиньте его вместе с stdio.h (точнее, cstdio).
Код:
#include "math.h"
тоже замените на
Код:
#include <cmath>
Это все не ошибки, но признак не лучшего стиля и устаревшие (хотя и все еще поддерживаемые) конструкции.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 16.09.2012, 22:32   #6
sinh
 
Регистрация: 16.09.2012
Сообщений: 7
По умолчанию

cпасибо большое, про fabs не знал.
sinh вне форума Ответить с цитированием
Старый 16.09.2012, 22:41   #7
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Если на то пошло,
Код:
int signum(double a)
{
    return (a > 0) - (a < 0);
}
Somebody вне форума Ответить с цитированием
Старый 16.09.2012, 23:04   #8
sinh
 
Регистрация: 16.09.2012
Сообщений: 7
По умолчанию

изменение abs на fabs ничего не поменяло, результаты все равно значительно отличаются. Мб до нужной точности сравнение не происходит? И еще в Turbo C++ и Visual Studio выдает разные результаты))

Последний раз редактировалось sinh; 16.09.2012 в 23:06.
sinh вне форума Ответить с цитированием
Старый 17.09.2012, 01:52   #9
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Ищите багу. Подставьте получающиеся результаты в выражение x = phi(x), чтобы узнать, считает ли хотя бы одна правильно. Выводите на экран все промежуточные значения, чтобы проверить вручную хотя бы первые несколько итераций. Замените функцию на какую-нибудь попроще - например, на phi(x) = 2*x (ответ - x = 0). И так далее.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 17.09.2012, 13:10   #10
sinh
 
Регистрация: 16.09.2012
Сообщений: 7
По умолчанию

Тему можно закрывать.
sinh вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти ошибку в коде,С++ ! Aaaaaa111 Помощь студентам 1 16.02.2012 11:10
Помогите найти ошибку в коде ( С++ ) nexUS1 Помощь студентам 1 29.12.2009 01:09
помогите найти ошибку в коде xaero93 Помощь студентам 4 20.04.2009 16:05
Помогите найти ошибку в коде! alex2008ean Паскаль, Turbo Pascal, PascalABC.NET 1 27.12.2008 18:31