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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2014, 12:49   #1
snakers
 
Регистрация: 10.06.2014
Сообщений: 3
По умолчанию Решение систем тригонометрических уравнений

Здравствуйте ! Прошу помощи с решением задачи :
Дана система вида
a1*tgx+b1*cosy=c1
a2*cosx+b2*siny=c2
Необходимо написать программу, решающую эту систему в зависимости от значений параметров a1,b1, a2,b2 и констант с1 и с2. В процессе решения должны быть или найдены все действительные корни (в пределах периода) или выдано сообщение о несовместности системы. Решение должно отыскиваться с определенной точностью (вводится с клавиатуры). Учесть, что не все численные методы сходятся.
Рекомендуется использовать следующие методы: метод Ньютона, метод градиентного спуска, метод итераций, метод бисекций.
Спасибо !
snakers вне форума Ответить с цитированием
Старый 10.06.2014, 19:23   #2
nikolay1982
Пользователь
 
Регистрация: 31.12.2013
Сообщений: 47
По умолчанию

Использовать все эти методы, или один из них?
Метод итераций, кажется проще.
язык то какой?
nikolay1982 вне форума Ответить с цитированием
Старый 10.06.2014, 20:30   #3
snakers
 
Регистрация: 10.06.2014
Сообщений: 3
По умолчанию

nikolay1982 : Любой из методов , язык C или С++.
snakers вне форума Ответить с цитированием
Старый 11.06.2014, 00:21   #4
nikolay1982
Пользователь
 
Регистрация: 31.12.2013
Сообщений: 47
По умолчанию

ну для начала исбавься от y.
1)a1*tgx+b1*cosy=c1 ; b1*cos y=c1-a1*tg x; 1а)cos y=(c1-a1 *tg x)/c2;

2)a2*cosx+b2*siny=c2; 2а) sin y=(c2-a2*cos x)/b2;
Возводим оба 1а) и 2а) в квадрат слаживаем:
cos ^ 2 (y)+sin ^2(y)=(c1-a1 *tg x)*((c1-a1 *tg x)/)/(c2*c2) + (c2-a2*cos x)*(c2-a2*cos x)/(b2*b2);
1= (c1-a1 *tg x)*((c1-a1 *tg x)/)/(c2*c2) + (c2-a2*cos x)*(c2-a2*cos x)/(b2*b2);
Хот мыслей понятен, да?
(c1-a1 *tg x)*((c1-a1 *tg x)/)/(c2*c2) + (c2-a2*cos x)*(c2-a2*cos x)/(b2*b2)-1=0;
Эту функцию можно обработать стандартным алгоритмом.
nikolay1982 вне форума Ответить с цитированием
Старый 11.06.2014, 00:21   #5
nikolay1982
Пользователь
 
Регистрация: 31.12.2013
Сообщений: 47
По умолчанию

Может гте-то ошибся, но идея верная
nikolay1982 вне форума Ответить с цитированием
Старый 11.06.2014, 08:00   #6
snakers
 
Регистрация: 10.06.2014
Сообщений: 3
По умолчанию

Извините пожалуйста,не могли бы вы написать решение в виде кода программы,а то я в программировании - ноль .Спасибо !
snakers вне форума Ответить с цитированием
Старый 11.06.2014, 14:10   #7
nikolay1982
Пользователь
 
Регистрация: 31.12.2013
Сообщений: 47
По умолчанию

Я ошибся. Должно быть:
ну для начала исбавься от y.
1)a1*tgx+b1*cosy=c1 ; b1*cos y=c1-a1*tg x; 1а)cos y=(c1-a1 *tg x)/b1;

2)a2*cosx+b2*siny=c2; 2а) sin y=(c2-a2*cos x)/b2;
Возводим оба 1а) и 2а) в квадрат слаживаем:
cos ^ 2 (y)+sin ^2(y)=(c1-a1 *tg x)*((c1-a1 *tg x)/)/(b1*b1) + (c2-a2*cos x)*(c2-a2*cos x)/(b2*b2);
1= (c1-a1 *tg x)*((c1-a1 *tg x)/)/(b1*b1) + (c2-a2*cos x)*(c2-a2*cos x)/(b2*b2);
Хот мыслей понятен, да?
((c1-a1 *tg x)*(c1-a1 *tg x))/(b1*b1) + (c2-a2*cos x)*(c2-a2*cos x)/(b2*b2)-1=0;
Эту функцию можно обработать стандартным алгоритмом.
При этом падает точность вычислений
nikolay1982 вне форума Ответить с цитированием
Старый 11.06.2014, 14:25   #8
nikolay1982
Пользователь
 
Регистрация: 31.12.2013
Сообщений: 47
По умолчанию

Получи 2(а может и 3) куска кода(форум не хочет брать >5000 символов)-
Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define ITER_MAX 100000
//Максимально допустимое кол.во итераций
/*
Sozdal Isipciuc Nikolai ,gruppa IP32
24.11.2008
*/

typedef struct INTERVAl
{
    double l,r;
}TInterval;
TInterval koreni[200];
TInterval intr={-3.24,-1.22};
TInterval interval2={0.01,1.0};
typedef double (*GET_DOUBLE_FUNC)(double);
//Указатель на фунццию
typedef GET_DOUBLE_FUNC TOJDESTV_FUNC,PROIZVOD_FUNC;
double double_zero=0;
int logOn=0;
typedef double PDOUBLE;
int suc=1;//Успешное выполнение текущей операции
double GS=(sqrt(5)-1)/2;//Коэфициент золотого сечения
double ln10=log(10);
double eps=1E-9;//Точность Для Вычисления Нелинейного Уравнения
double eps2=1E-9;//Точность для вычисления производной приближенным способом
char div2Name[]= "Div 2    metod:";
char iterOut[]=  "Na iteratsii %02i  esti koreni x=%5.13f f(x)=%10.3le\n";
char format2Out[]="%5.10f f(x)=%10.3le\n";
char buf[256];
//Data End--------------------------------------------------------------------------
//---------------------------------------------------------------------------
double fa_fb(GET_DOUBLE_FUNC func,double a,double b)   //Тест Ролля-если результ<0 то есть отделенный корень
{
    if (!func)
    {
        printf("error!Functia =NULL!\n ");
        return 0;
    }
    return func(a)*func(b);
}
char *makeStr(char *metodName)
{
    int i;
    for (i = 0; i < 256; i++)
    {
        buf[0]=0;
    }
    strcpy(buf,metodName);
    strcat(buf,iterOut);
    return buf;
}

int algMetod(GET_DOUBLE_FUNC func, double  a,double b,
             double h,double epsi)
{
    double x0=a,x;
    x=x0;
    int i=0;
    do
    {
        x=x0+h;
        if (func(x)==0)
        {
            printf("Tocinii koreni= %5.7lf; ",x);//Вероятность этого очень мала,но все же ...
            x=x+epsi;
            continue;
        }
        if (fa_fb(func,x0,x)<0)
        {
            printf("Na otrezke x0= [%5.4lf;%5.4lf] esti koreni\n",x0,x);
            koreni[i].l=x0;
            koreni[i].r=x;
            i++;
        }
        x0=x;
    }
    while (x<b);
    //printf("end algMetod\n");
    return i;
}

double metodDel2(GET_DOUBLE_FUNC func, double  a,double b,double epsi,int &iter)
{
    double x,tmp;
    iter=0;
    if (!func)
    {
        printf("Oshibka!Functia =NULL!\n ");    //в этой программе это не произойдет
        return 0;
    }
    if (b<a)
    {
        tmp=a;    //меняем местами если надо
        a=b;
        b=tmp;
    }
    do
    {
        x=(a+b)/2;
        if (func(x)==0) return x;//МЫ СЛУЧАЙНО попали..
        if (fa_fb(func,a,x)<0) b=x;//Тест Ролля подскажет,где зарыт корень
        else a=x;
        iter++;
        if (iter>ITER_MAX)
        {
            printf("\niter>ITER_MAX!!! Zatsiklivaie programmi!!Vihodim iz tsikla");
            break;
        }
    }
    while ( fabs(func(x))>=epsi);
    //while( fabs(b-a)>=epsi);//пока мы не довольны точностью будем копать дальше
    return x;
}
nikolay1982 вне форума Ответить с цитированием
Старый 11.06.2014, 14:27   #9
nikolay1982
Пользователь
 
Регистрация: 31.12.2013
Сообщений: 47
По умолчанию

Код:
//globalinie
double a1,b1,c1,a2,b2,c2;
//my functions
#define tg tan

double func1(double x,double y)
{
    return a1*tg(x)+b1*cos(y)-c1;//esli korni to -->0
}

double func1Trace(double x,double y)
{
    double r1,r2;
    r1=tg(x);
    printf("\ntg(x)=%f",r1);
    r1=a1*tg(x);
    printf("\na1*tg(x)=%f",r1);
    r2=cos(y);
    printf("\ncos(y)=%f",r2);
    r2=r2*b1;
    printf("\nb1*cos(y)=%f",r2);
    r1=r1+r2-c1;
    printf("\n(a1*tg(x))+(b1*cos(y))-c1=%f",r1);
    return r1;
    //return (a1*tg(x))+(b1*cos(y))-c1;//esli korni to -->0
}
double func2(double x,double y)
{
    return a2*cos(x)+b2*sin(y)-c2;//esli korni to -->0
}

double my_fx(double x)
{
    double ret;
    /*
    double tgx,cosx;
    tgx=tg(x);
    cosx=cos(x);
     */
    //Пусть будет в чистом виде без оптимизации
    ret=((c1-a1 *tg (x))*(c1-a1 *tg (x)))/(b1*b1) + ((c2-a2*cos (x))*(c2-a2*cos (x)))/(b2*b2)-1.0;//esli koreni ->0
    return ret;
}

double my_y_by_x(double x)
{
    double r;
    r=(c1-a1 *tg (x))/b1;
    r=acos(r);
    return r;
}

double my_y_by_x2(double x)
{
    double r;
    r=(c2-a2*cos (x))/b2;
    r=asin(r);
    return r;
}

double fine_y(double x,double epsi)
{
    double y,v,l1,l2,y2,er1,er2;
    double minEr,y3;
    y=my_y_by_x(x);
    y2=my_y_by_x2(x);
    //l1=func1Trace(x,y);
    l1=func1(x,y);
    l2=func2(x,y);
    er1=fabs(l1)+fabs(l2);
    l1=func1(x,y2);
    l2=func2(x,y2);
    er2=fabs(l1)+fabs(l2);
    if (er1>er2)
    {
        if (er2<epsi) return y2;
        minEr=er2;
        y3=y2;
    }
    else
    {
        if (er1<epsi) return y;
        minEr=er1;
        y3=y;
    }
    int iter=0;
    for (v=y3-0.1;v<y3+0.1;v+=epsi,iter++)
    {
        l1=func1(x,v);
        l2=func2(x,v);
        er1=fabs(l1)+fabs(l2);
        if (er1<minEr)
        {
            minEr=er1;
            y3=v;
        }
        if (iter>=ITER_MAX) break;
    }
    return y3;
}

int proverka_x(double x,double epsi)
{
    double y,l1,l2,y2;
    y=my_y_by_x(x);
    y2=my_y_by_x2(x);
    //l1=func1Trace(x,y);
    l1=func1(x,y);
    l2=func2(x,y);
#if 0
    //printf("\nProverka:y=%f y2=%f",y,y2);
    printf("\nProverka:y=%f",y);
    printf("\n 1) a1*tg(x)+b1*cos(y)-c1=%f",l1);
    printf("\n 2) a2*cos(x)+b2*sin(y)-c2=%f",l2);
    if (fabs(y-y2)>epsi)
    {
        l1=func1(x,y2);
        l2=func2(x,y2);
        printf("\nProverka:y2=%f",y2);
        printf("\n 1) a1*tg(x)+b1*cos(y)-c1=%f",l1);
        printf("\n 2) a2*cos(x)+b2*sin(y)-c2=%f",l2);
    }
#endif
    y=fine_y(x,epsi);
    l1=func1(x,y);
    l2=func2(x,y);
    printf("\nProverka:fine_y=%f",y);
    printf("\n 1) a1*tg(x)+b1*cos(y)-c1=%f",l1);
    printf("\n 2) a2*cos(x)+b2*sin(y)-c2=%f",l2);
    l1=fabs(l1);
    l2=fabs(l2);

    return (l1<epsi)&&(l2<epsi);
}

double vvod(const char* str)
{
    double ret;
    printf("\nVvod %s:",str);
    scanf("%lf",&ret);
    return ret;
}

int main(int argc, char* argv[])
{
    double a,b,v,epsi,x;
    int iter,i;
    GET_DOUBLE_FUNC func=(GET_DOUBLE_FUNC)my_fx;
    double step=3.0f;
    a=0.0;
    b=2*M_PI;
    epsi=1e-12;

#if 1
    a1=-1;
    b1=2;
    c1=0.5;
    a2=-2;
    b2=3;
    c2=0.7;
#else
    a1=vvod("a1");
    b1=vvod("b1");
    c1=vvod("c1");
    a2=vvod("a2");
    b2=vvod("b2");
    c2=vvod("c2");
    epsi=vvod("epsi");
#endif
    printf("\na1=%f b1=%f c1=%f",a1,b1,c1);
    printf("\na2=%f b2=%f c2=%f",a2,b2,c2);
    printf("\nepsi=%e\n",epsi);
    int n=algMetod(func,a,b,0.02,epsi); //Алгоритмический метод скажет нам сколько у нас корней на заданном отрезке
    iter=0;
    for ( i=0;i<n;i++)
    {
        printf("\n na [%5.2lf ; %5.2lf] esti Koreni\n\n",koreni[i].l,koreni[i].r);
        x=metodDel2(func,koreni[i].l,koreni[i].r,epsi,iter);
        printf(makeStr(div2Name),iter,x,func(x));
        proverka_x(x,epsi);
    }
    if (n==0)printf("\nKornei net!Kopali, ne nashli...");
    /*
    for(v=a;v<=b;v+=step){
    	metodDel2(my_fx,a,b,epsi,iter);
    	}
    	*/
    return 0;
}
nikolay1982 вне форума Ответить с цитированием
Старый 11.06.2014, 14:48   #10
nikolay1982
Пользователь
 
Регистрация: 31.12.2013
Сообщений: 47
По умолчанию

Программа выводит:


a1=-1.000000 b1=2.000000 c1=0.500000
a2=-2.000000 b2=3.000000 c2=0.700000
epsi=1.000000e-12
Na otrezke x0= [0.6800;0.7000] esti koreni
Na otrezke x0= [1.9400;1.9600] esti koreni
Na otrezke x0= [4.1000;4.1200] esti koreni
Na otrezke x0= [5.1200;5.1400] esti koreni

na [ 0.68 ; 0.70] esti Koreni

Div 2 metod:Na iteratsii 32 esti koreni x=0.6943605063623 f(x)=-4.980e-13

Proverka:fine_y=0.841498
1) a1*tg(x)+b1*cos(y)-c1=0.000000
2) a2*cos(x)+b2*sin(y)-c2=-0.000000
na [ 1.94 ; 1.96] esti Koreni

Div 2 metod:Na iteratsii 36 esti koreni x=1.9513308255546 f(x)=-5.642e-13

Proverka:fine_y=3.127314
1) a1*tg(x)+b1*cos(y)-c1=-0.000000
2) a2*cos(x)+b2*sin(y)-c2=0.085667
na [ 4.10 ; 4.12] esti Koreni

Div 2 metod:Na iteratsii 35 esti koreni x=4.1182839738921 f(x)= 5.920e-13

Proverka:fine_y=-0.140305
1) a1*tg(x)+b1*cos(y)-c1=-0.000000
2) a2*cos(x)+b2*sin(y)-c2=-0.000000
na [ 5.12 ; 5.14] esti Koreni

Div 2 metod:Na iteratsii 32 esti koreni x=5.1349031886970 f(x)=-5.529e-13

Proverka:fine_y=2.610236
1) a1*tg(x)+b1*cos(y)-c1=-0.000000
2) a2*cos(x)+b2*sin(y)-c2=0.000000
nikolay1982 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Си, Си++ решение систем уравнений Осип Помощь студентам 3 05.09.2012 18:54
Решение систем линейных уравнений NaSteNka13182 Паскаль, Turbo Pascal, PascalABC.NET 0 20.11.2011 00:10
ЗАдача по с++ . решение систем уравнений Forella Помощь студентам 1 01.10.2011 23:09
Решение систем нелинейных уравнений. Си True_girl Помощь студентам 0 03.05.2010 11:46
Решение систем линейных уравнений. SadmeN Помощь студентам 5 08.06.2009 23:36