Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Апроксимация.Метод Линейной интерполяции. 
:(
    Опции темы
slevin45
Дата 11.3.2014, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 4.3.2014

Репутация: нет
Всего: нет



Здравствуйте!Помогите,пожалуйста,найти ошибку в коде.Высчитывает неверные корни.
Код

#include<iostream>
#include<math.h>
using namespace std;
int main (void)
{
    int i,j,m=11;
    double x_t,x_m[12]={0},y[22]={0},y_m[12],x[22],polinom,pogr,a=-4,b=2,n=2;
    for(i=1;i<=m;i++)
    {
        x_m[i]=a+(i-1)*(b-a)/(m-1);
    }
    for(i=1;i<=m;i++)
    {
        y_m[i]=0.1*pow(x_m[i],3)+pow(x_m[i],2)-10*sin(x_m[i]);
    }
    for(j=1;j<=21;j++)
    {
        x[j]=a+(j-1)*(b-a)/20;
    }
    for(j=1;j<=21;j++)
    {
        y[j]=0.1*pow(x[j],3)+pow(x[j],2)-10*sin(x[j]);
    }
    for(j=1;j<=21;j++)
    {
        x_t=x[j];
        if(x_t>=x_m[1]&&x_t<=x_m[m])
        {
            i=2;
            if(x_t>x_m[i])
            {
                i++;
            }
                polinom=y_m[i-1]+(x_t-x_m[i-1])*(y_m[i]-y_m[i-1])/(x_m[i]-x_m[i-1]);
                cout<<endl;
                pogr=y[j]-polinom;
                cout<<pogr;
        }
        else
        {
            cout<<"tefyschi x za predelami tablici";
        }
}
    system("pause");
    return(0);
}


Это сообщение отредактировал(а) slevin45 - 11.3.2014, 21:39
PM MAIL   Вверх
feodorv
Дата 12.3.2014, 06:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Код не разбирал, чисто визуально. Перед циклом
Цитата(slevin45 @  11.3.2014,  22:37 Найти цитируемый пост)
    for(j=1;j<=21;j++)

нужно переустановить значение  переменной i в 2, а из цикла убрать
Цитата(slevin45 @  11.3.2014,  22:37 Найти цитируемый пост)
            i=2;


Это сообщение отредактировал(а) feodorv - 12.3.2014, 08:19


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
slevin45
Дата 12.3.2014, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 4.3.2014

Репутация: нет
Всего: нет



Не получается всё равно...
Вот написал другой код,по другой блок-схеме,но тут тоже что-то не так...Ааааааа.Помогите,пожалуйста.
Код

#include<iostream>
#include<math.h>
using namespace std;
int main (void)
{
    int i,j,m=12;
    double x_t,x_m[12]={0},y[22]={0},y_m[12]={0},x[22]={0},polinom,pogr,n=2,a_v[12]={0},b_v[12]={0},a=-4,b=2;
    for(i=1;i<m;i++)
    {
        x_m[i]=a+(i-1)*(b-a)/(m-1);
    }
    for(i=1;i<m;i++)
    {
        y_m[i]=0.1*pow(x_m[i],3)+pow(x_m[i],2)-10*sin(x_m[i]);
    }
    for(j=1;j<22;j++)
    {
        x[j]=a+(j-1)*(b-a)/20;
    }
    for(j=1;j<22;j++)
    {
        y[j]=0.1*pow(x[j],3)+pow(x[j],2)-10*sin(x[j]);
    }
    for(j=1;j<22;j++)
    {
        x_t=x[j];
        i=0;
stop:
        i++;
        if(x_t<=x_m[i]&&x_t>=x[i-1])
        {
            polinom=a_v[i]*x_t+b_v[i];
            a_v[i]=(y_m[i]-y_m[i-1])/(x_m[i]-x_m[i-1]);
            b_v[i]=y_m[i-1]-a_v[i]*x_m[i-1];
            cout<<endl;
            pogr=y[j]-polinom;
            cout<<pogr;
        }
        else
        {
            goto stop;
        }
    }
    system("pause");
    return(0);
}


Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  Блок_схема..png 7,73 Kb
PM MAIL   Вверх
bsa
Дата 14.3.2014, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



что это за goto stop?!? Забудь о существовании этого оператора. Используй тут for или while.
PM   Вверх
baldina
Дата 15.3.2014, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



slevin45

1. используй функции. это упростит код и уменьшит число ошибок.
уменьши число циклов, скажем x и y можно одновременно рассчитывать
Код

double lerp (double a, double b, double t) // интерполяция между a и b по t
{
   return a+(b-a)*t;
}

double f (double x) // f(x)
{
   return 0.1*pow(x,3)+pow(x,2)-10*sin(x);
}

...

for (int i=0; i < n; ++i) {
  t = double(i)/(n-1);
  x[i] = lerp (a,b, t);
  y[i] = f(x[i]);
}


так удобнее, правда?

2. у тебя какая-то чехарда с индексами. массивы в С/С++ индексируются от 0 до n-1
значит циклы, заполняющие массивы, должны быть вида for (int i=0; i < n; ++i)

3. последний цикл
3а. значения a_v[i], b_v[i] сначала используются и только потом инициализируются
3b. вместо goto лучше цикл for (i=0; x_t<=x_m[i]; ++i)
3с. есть мнение, что можно обойтись без массивов: останется последний цикл, в котором нужные значения рассчитываются непосредственно
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0812 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.