Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Метод дихотомии для решения СНУ, помогите добить задачу 
:(
    Опции темы
Danza
  Дата 24.12.2007, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 Уже который день мучаюсь с решением СНУ методом дхотомии smile  Для одного уравнения всё прекрасно работает, для двух - нет. Помогите пожалуйста если кто сталкивался с таким. 
В задаче берётся начальное приближение.
Код

double f_root(double y);//y-na4alnoe priblijenie
double g_root(double x);
double norm (double x0, double x1, double y0, double y1);
double f(double x, double y);
double g(double x, double y);

int _tmain(int argc, _TCHAR* argv[])
{
    double x, xnext, y, ynext;
    int t=1;
    int n=0, m=0;
    x=0.5; y=0.5;  // начальное приближение
    while (t!=0)
    {
        xnext=f_root( y);
        //cout<<xnext<<endl;
        ynext=g_root(x);
        //cout<<ynext<<endl;
        n++;
        if (norm(x, xnext, y, ynext)<0.0001) t=0;
        //if (n==65000){ n=0; m++;}
        if (n==65000) t=0;
        x=xnext;
        y=ynext;
    }
    cout<<"x="<<x<<"\ty="<<y<<"\nn="<<n<<"\nm="<<m<<endl;;
    system("pause");
    return 0;
}

double f_root( double y)//y-na4alnoe priblijenie
{
    double x0=0,x1=2,res;
l1:    if (f(x0, y)*f(x1, y)>=0)
    {
        x1++;
        x0--;
        goto l1;
    }
    else
    {        
        while (true) 
        {    
            res=(x1+x0)/2;
            if (f(x0, y)>0)
            {
                if (f(res, y)>0) x0=res; else x1=res;
            }
            else //if (function1(x0)<0)
            {
                if(f(res, y)<0) x0=res; else x1=res;
            }
            //cout<<x0<<" "<<x1<<endl;
            if (abs(x1-x0)<0.00001) break;
        };
    }
    return (x1+x0)/2;
}
double g_root(double x)
{
    double x0=0,x1=2,res;
l2:    if (g(x, x0)*g(x, x1)>=0)
    {
        x1++;
        //x0--;
        goto  l2;
    }
    else
    {        
        while (true) 
        {    
            res=(x1+x0)/2;
            if (g(x, x0)>0)
            {
                if (g(x, res)>0) x0=res; else x1=res;
            }
            else //if (function1(x0)<0)
            {
                if(g(x, res)<0) x0=res; else x1=res;
            }
            //cout<<x0<<" "<<x1<<endl;
            if (abs(x1-x0)<0.00001) break;
        }
    }
    return (x1+x0)/2;
}
double norm (double x0, double x1, double y0, double y1)
{
    return /*abs(x0-y0)+abs(x1-y1);//*/sqrt( (x0-x1)*(x0-x1)+(y0-y1)*(y0-y1) );
}
double f(double x, double y)
{
    return x*x+y*y-1;
}
double g(double x, double y)
{
    return x-y;
}

PM MAIL ICQ   Вверх
Rimch
Дата 25.12.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



нужно решать оба уравнения совместно в одной системе
Тк мы же решаем задачу  F(x)=0, где F - вектор функция, x- вектор
тебе нужно что-то вроде
Код

double *f(double x, int n)
{double *f_= new double[n];
 f_[0]=// первое уравнение системы
 //...
 f_[n-1]=// n-ое уравнение системы
return f_;
}

и далее работаем с нашей функцией как будто решаем не систему, а уравнение.
Абсолютно все теже действия что и при решении уравнения, с учетом того что функция возвращает вектор!!!

PM MAIL ICQ   Вверх
Danza
Дата 26.12.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Честно говоря не оч пойму как это всё бубдет работать. В субботу сдавать, я в шоке, ибо это последнее задание (
Плз, если есть время, напиши как это будет выглядеть.
PM MAIL ICQ   Вверх
Danza
Дата 28.12.2007, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, уже переделала.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


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

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


 




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


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

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