2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 метод Лобачевского-Греффе (С++)
Сообщение03.10.2012, 22:20 
Аватара пользователя


17/12/10
538
Пишу на C++ код для решения алгебраических уравнений, по методу Лобачевского-Греффе, случай действительных корней

вот в этой теме обсуждал http://dxdy.ru/topic60532.html

хочу чтоб числа из одного массива возвелись в квадрат и перешли в другой массив
почему то компилятор пишет:
Цитата:
Ошибка 1 error C2668: pow: неоднозначный вызов перегруженной функции

хватит ли типа
Код:
long long int
?

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <math.h>

using namespace std;
const int kol_chl = 5;

int main()
{
        setlocale( LC_ALL,"Russian" );

        double koef[kol_chl]={1, -35, 380, -1350, 1000};
        double st1 [kol_chl];
        double st2 [kol_chl];
        double st3 [kol_chl];
        cout << sizeof ( long long int) << endl;

        // возведение степень чисел массива koef и запись этих чисел в массив st1
        for (int i=0; i < kol_chl; i++)
        {
                st1[i]=pow(koef[i],2);
        }


        cout << koef[0] << " " << koef[1] << " " << koef[2] << " " << koef[3] << " " << koef[4] << endl;

        for (int i=0; i < kol_chl; i++)
        {
                cout << st1[i] << endl ;
        }

        system("pause");
  return 0;      
}
 


поменял тип массивов с long long int на double теперь заработало.

 Профиль  
                  
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение03.10.2012, 22:44 
Аватара пользователя


03/12/08
351
Букачача
Sverest в сообщении #626672 писал(а):
Ошибка 1 error C2668: pow: неоднозначный вызов перегруженной функции
Эта ошибка из-за того была, что функция pow не перегружена для типа long long int:
MSDN писал(а):
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
double pow(
   double x,
   double y  
);
double pow(
   double x,
   int y
);  // C++ only
float pow(
   float x,
   float y  
);  // C++ only
float pow(
   float x,
   int y
);  // C++ only
long double pow(
   long double x,
   long double y
);  // C++ only
long double pow(
   long double x,
   int y
);  // C++ only
float powf(
   float x,
   float y  
);


 Профиль  
                  
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение04.10.2012, 12:25 
Аватара пользователя


17/12/10
538
Как теперь сделать, чтоб посчиталось $-2 \cdot a_{i-1} a_{i+1}$
надо стек создавать?

 Профиль  
                  
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение04.10.2012, 22:00 


12/06/12
34
Sverest
Непонятно в чем проблема? В ваших обозначениях это будет примерно так
Используется синтаксис C++
for(int i=1; i<kol_chl-1; i++)
=-2*koef[i-1]*koef[i+1];

 Профиль  
                  
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение05.10.2012, 22:54 
Аватара пользователя


17/12/10
538
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <math.h>

using namespace std;
const int kol_chl = 5;

int main()
{
        setlocale( LC_ALL,"Russian" );
       
        double koef[kol_chl]={1, -35, 380, -1350, 1000};
        double st1 [kol_chl];
        double st2 [kol_chl];
        double st3 [kol_chl];
        double rez [kol_chl];

        int proverka= 1;
        int shetcik = 0;
       
        //зануление

        for (int i=0; i < kol_chl; i++)
        {
                st1[i]=0;
                st2[i]=0;
                st3[i]=0;
                rez[i]=0;
        }

        do {

                        // возведение степень чисел массива koef и запись этих чисел в массив st1
                        for (int i=0; i < kol_chl; i++)
                        {
                                st1[i]=pow(koef[i],2);
                        }

                        //-2 a i-1 a i+1
                        for (int i=1; i < kol_chl - 1; i++)
                        {
                                st2[i]=-2*koef[i-1]*koef[i+1];
                        }
                        //2 a i-2 a i+2
                        for (int i=2; i < kol_chl - 2; i++)
                        {
                                st3[i]=2*koef[i-2]*koef[i+2];
                        }

                        //сложение st1 st2 st3

                        for (int i=0; i < kol_chl; i++)
                        {
                                koef[i]=st1[i]+st2[i]+st3[i];
                                if (koef[i] > 10E100)
                                        proverka=0;
                        }

                shetcik = shetcik++;

        } while (proverka);


        cout << "shetcik " << shetcik << endl;
       
        //2^shetcik
        int g=2;
        for (int i=1; i < shetcik; i++)
        {
                g=g*2;
                cout << "g= " <<  g << endl;
        }
       
        double p = 1/g;
        cout << "p= " << p << endl;

        //вычисление корней
        for(int i=0; i < kol_chl; i++)
        {
                double c = koef[i+1]/koef[i];
                cout << "c" << i << "= " << c << endl ;
                rez[i]=pow(koef[i+1]/koef[i], (1/g));
                cout << "rez" << i << "= " << rez[i] << endl ;
        }
       



        // вывод koef
        cout << koef[0] << " " << koef[1] << " " << koef[2] << " " << koef[3] << " " << koef[4] << endl;

        //вывод st
        cout << "st1" << endl;

        for (int i=0; i < kol_chl; i++)
        {
                cout << st1[i] << endl ;
        }

        cout << "st2" << endl;

        for (int i=1; i < kol_chl-1; i++)
        {
                cout << st2[i] << endl ;
        }

        cout << "st3" << endl;

        for (int i=2; i < kol_chl-2; i++)
        {
                cout << st3[i] << endl ;
        }
       
        //вывод rez
        /*
        for (int i=0; i < kol_chl; i++)
        {
                cout << "rez= " << rez[i] << endl ;
        }
        */

        system("pause");
  return 0;      
}

 


В ниже написанном участке кода
переменная shetcik равна 6
g получается 64
почему тогда $p=\frac{1}{64}$ C++ пишет равным $0$, а не $0,015625$

Используется синтаксис C++
int g=2;
        for (int i=1; i < shetcik; i++)
        {
                g=g*2;
                cout << "g= " <<  g << endl;
        }
       
        double p = 1/g;
        cout << "p= " << p << endl;
 

 Профиль  
                  
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение05.10.2012, 23:11 
Заслуженный участник


28/04/09
1933
Sverest в сообщении #627413 писал(а):
почему тогда $p=\frac{1}{64}$ C++ пишет равным $0$, а не $0,015625$
Потому что при целочисленных операндах / $\text{---}$ операция целочисленного деления в C++. Вам следовало бы погрузить в воду запятую одного из операндов:
Используется синтаксис C++
double p = (double)1/g;
или
Используется синтаксис C++
double p = 1./g;
и т.п.

 Профиль  
                  
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение06.10.2012, 12:15 
Аватара пользователя


17/12/10
538
EtCetera в сообщении #627421 писал(а):
следовало бы погрузить в воду


Что значит погрузить в воду?

 Профиль  
                  
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение06.10.2012, 12:47 
Аватара пользователя


03/12/08
351
Букачача
Sverest в сообщении #627527 писал(а):
Что значит погрузить в воду?
Сделать плавающей еще говорят, то бишь типом с плавающей запятой.

 Профиль  
                  
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение06.10.2012, 14:58 
Аватара пользователя


17/12/10
538
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <math.h>

using namespace std;
const int kol_chl = 5;

int main()
{
        setlocale( LC_ALL,"Russian" );
       
        double koef[kol_chl]={1, -35, 380, -1350, 1000};
        double st1 [kol_chl];
        double st2 [kol_chl];
        double st3 [kol_chl];
        double rez [kol_chl];

        int proverka= 1;
        int shetcik = 0;
       
        //зануление

        for (int i=0; i < kol_chl; i++)
        {
                st1[i]=0;
                st2[i]=0;
                st3[i]=0;
                rez[i]=0;
        }

        do {

                        // возведение степень чисел массива koef и запись этих чисел в массив st1
                        for (int i=0; i < kol_chl; i++)
                        {
                                st1[i]=pow(koef[i],2);
                        }

                        //-2 a i-1 a i+1
                        for (int i=1; i < kol_chl - 1; i++)
                        {
                                st2[i]=-2*koef[i-1]*koef[i+1];
                        }
                        //2 a i-2 a i+2
                        for (int i=2; i < kol_chl - 2; i++)
                        {
                                st3[i]=2*koef[i-2]*koef[i+2];
                        }

                        //сложение st1 st2 st3

                        for (int i=0; i < kol_chl; i++)
                        {
                                koef[i]=st1[i]+st2[i]+st3[i];
                                if (koef[i] > 10E100)
                                        proverka=0;
                        }

                shetcik = shetcik++;

        } while (proverka);


        cout << "shetcik " << shetcik << endl;
       
        //2^shetcik
        int g=2;
        for (int i=1; i < shetcik; i++)
        {
                g=g*2;
                cout << "g= " <<  g << endl;
        }
       
        double p = 1./g;
        cout << "p= " << p << endl;

        //вычисление корней
        for(int i=0; i < kol_chl-1; i++)
        {
                double c = (double) koef[i+1]/koef[i];
                cout << "c" << i << "= " << c << endl ;
                rez[i]=pow((double) koef[i+1]/koef[i], p );
                cout << "rez" << i << "= " << rez[i] << endl ;
        }
       



        // вывод koef
        cout << koef[0] << " " << koef[1] << " " << koef[2] << " " << koef[3] << " " << koef[4] << endl;

        //вывод st
        cout << "st1" << endl;

        for (int i=0; i < kol_chl; i++)
        {
                cout << st1[i] << endl ;
        }

        cout << "st2" << endl;

        for (int i=1; i < kol_chl-1; i++)
        {
                cout << st2[i] << endl ;
        }

        cout << "st3" << endl;

        for (int i=2; i < kol_chl-2; i++)
        {
                cout << st3[i] << endl ;
        }
       
        //вывод rez
       
        for (int i=0; i < kol_chl-1; i++)
        {
                cout << "rez= " << rez[i] << endl ;
        }
       
        system("pause");
  return 0;      
}
 


Спасибо, заработало, теперь чтоб можно было с любым уравнением работать надо динамическую память использовать? Без нее не обойтись?

 Профиль  
                  
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение06.10.2012, 15:18 
Аватара пользователя


03/12/08
351
Букачача
Sverest в сообщении #627561 писал(а):
теперь чтоб можно было с любым уравнением работать надо динамическую память использовать? Без нее не обойтись?
Конечно, а как же без неё.

 Профиль  
                  
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение06.10.2012, 19:48 
Аватара пользователя


17/12/10
538
можно ли в коде реализовать вычисление $f(x_1)$?

 Профиль  
                  
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение06.10.2012, 22:15 


12/06/12
34
Sverest
Пусть есть многочлен $P(x)=a_0+a_1x+a_2x^2+\ldots +a_nx^n$.
Функцию, осуществляющую вычисление многочлена степени $n$ по его коэффициентам $a_i$ можно составить используя так называемую схему Горнера. Эта схема состоит в том, что многочлен переписывается в следующей форме:
$P(x)=(((0\cdot x+a_n)\cdot x+a_{n-1})\cdot x+\ldots+a_1)\cdot x+a_0$.


При таком порядке вычислений для получения значения $P(x)$ требуется лишь $n$ умножений и $n$ сложений.

Используется синтаксис C++
     //n-степень полинома, a-массив коэффициентов (размер массива n+1), x-значение
     double pol(int n, double* a, double x){
     double p=0;
     for (int i = n; i >= 0; i--)
        p = p*x + a[i];
     return p;}
 

 Профиль  
                  
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение08.10.2012, 19:36 
Аватара пользователя


17/12/10
538
Попробовал сделать с динамической памятью, почему то при выводе массива вылетает с ошибкой

Изображение

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <math.h>
using namespace std;


int main()
{
        setlocale( LC_ALL,"Russian" );

        int StepYr;
        cout << "Введите наибольшую степень уравнения" << endl;
        cin >> StepYr;
        StepYr=StepYr+1;

        double * dPtr_koef = new double [StepYr];

        int koff=StepYr - 1;
        for (int i = 0; i < StepYr; i++)
        {
                cout << "Введите коэффициент при x в степени:" << koff << " : " ;
                koff=koff-1;
                cin >> dPtr_koef[i];
        }

        for (int i = 0; i < StepYr; i++)
        {
                cout << dPtr_koef[i] << endl;
                delete [] dPtr_koef;
        }



        system("pause");
  return 0;      
}
 

 Профиль  
                  
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение08.10.2012, 19:47 
Заслуженный участник


28/04/09
1933
Вот это
Sverest в сообщении #628481 писал(а):
Используется синтаксис C++
delete [] dPtr_koef;
должно стоять после цикла.

 Профиль  
                  
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение08.10.2012, 20:57 
Аватара пользователя


17/12/10
538
Спасибо, получилось, я правильно освободил память?

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <math.h>
using namespace std;


int main()
{
        setlocale( LC_ALL,"Russian" );

        int StepYr;
        cout << "Введите наибольшую степень уравнения" << endl;
        cin >> StepYr;
        StepYr=StepYr+1;

        double * dPtr_koef = new double [StepYr];
        double * dPtr_st1  = new double [StepYr];
        double * dPtr_st2  = new double [StepYr];
        double * dPtr_st3  = new double [StepYr];
        double * dPtr_rez  = new double [StepYr];

        int koff=StepYr - 1;
        for (int i = 0; i < StepYr; i++)
        {
                cout << "Введите коэффициент при x в степени:" << koff << " : " ;
                koff = koff - 1;
                cin >> dPtr_koef[i];
        }
        /*
        for (int i = 0; i < StepYr; i++)
        {
                cout << dPtr_koef[i] << endl;

        }
        */

        for (int i = 0; i < StepYr; i++)
        {

                dPtr_st1[i]=0;         
                dPtr_st2[i]=0;
                dPtr_st3[i]=0;
                dPtr_rez[i]=0;

        }

        int proverka = 1;
        int shetcik = 0;

        do {

                for (int i = 0; i < StepYr; i++)
                {
                        dPtr_st1[i] = pow (dPtr_koef[i], 2);
                }


       
// вывод
                /*for (int i = 0; i < StepYr; i++)
                {
                        cout << dPtr_st1[i] << endl;
                }*/

// st2
                for (int i = 1; i < StepYr - 1; i++)
                {
                        dPtr_st2[i] = -2 * dPtr_koef[i-1] * dPtr_koef[i+1];
                }

                for (int i=2; i < StepYr - 2; i++)
                {
                                dPtr_st3[i] = 2 * dPtr_koef[i-2] * dPtr_koef[i+2];
                }

                for (int i=0; i < StepYr; i++)
                        {
                                dPtr_koef[i] = dPtr_st1[i] + dPtr_st2[i] + dPtr_st3[i];
                                if (dPtr_koef[i] > 10E100)
                                        proverka = 0;
                        }
                        shetcik = shetcik++;
                } while (proverka);

        cout << "------------------------" << endl;
        /*     
        for (int i = 0; i < StepYr; i++)
        {
                cout << dPtr_koef[i] << endl;

        }
        */

        int g = 2;
        for (int i = 1; i < shetcik; i++)
        {
                g = g * 2;
               
        }
       
        double p = 1. / g;

        for(int i = 0; i < StepYr - 1; i++)
        {      
                dPtr_rez[i]=pow((double) dPtr_koef[i+1] / dPtr_koef[i], p);
        }

        cout << "====================" << endl;

        for (int i=0; i < StepYr - 1; i++)
        {
                cout << "rez= " << dPtr_rez[i] << endl ;
        }

                delete [] dPtr_koef;
                delete [] dPtr_st1;
                delete [] dPtr_st2;
                delete [] dPtr_st3;
                delete [] dPtr_rez;            
       
        system("pause");
  return 0;      
}

 



У меня данные выводятся в виде: 4.02063e + 079 Как можно сделать, чтоб точка была после 6й цифры

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group