C/C++ - Решение кубических уравнений на С++

Аватара пользователя
XEN_STRANGER

C/C++ - Решение кубических уравнений на С++

Сообщение XEN_STRANGER »

Само объяснение есть, вот -
http://cubic-solver.info/
Тока я чёт не собиру всё это в кучу, может кто поможет составить последовательность действий.



Вот как я думаю:



1. берём уравнение a*x^3 + b*x^2 + c*x + d = 0

2. заменяем х на у, да так чтоб x = y - (b / 3*a),

3. приводим к более простому (каноническом) виду: y^3 + p*y + q = 0,

4. вводим р= -(b^2 / 3*a^2) + c/a и вводим q= (2*b / 27*a^3) - (b*c / 3*a^2) + b/a

5. с помошью формулы Кардано находим у, только я не пойму формулу (я только в 8-ом классе) kardano.png, напишите плиз, мне её в виде кода!

6. теперь если q^2/4 + p^3/27 > 0 , то кубическое уравнение имеет три различных корня: один из них действительный, два других - сопряженные комплексные;

если q^2/4 + p^3/27 = 0, то все три корня действительные, два из них равны

если q^2/4 + p^3/27 < 0, то все три корня действительные и различные.



чё-то я запутался...



А можно было приведя к каноническому виду найти значения p и q, а затем найти "y", используя дискриминант (D = -4p3 - 27q2) только как находится "y" дальше, уже с найденным дискриминантом? (также как x1 и x2 в квадратных уравнениях)



Обязательно ознакомьтесь с материалом на странице
http://cubic-solver.info/
Аватара пользователя
XEN_STRANGER

Re: C/C++ - Решение кубических уравнений на С++

Сообщение XEN_STRANGER »

crashtuak,
Цитата crashtuak:



Вот Тригонометрическая Формула Виета, первый раз вижу, но она сравнительно легкая, и почти идеально подходит для реализации на С++:
http://ru.wikipedia.org/wiki/%D0%A2%...B5%D1%82%D0%B0
C/C++ - Управление системой через C++




Ты наверное школу уже закончил, может в универе учишься, может в классе 11-ом, тоесть тригонометрию уже изучаешь, а я пока ещё "не дорос" и не знаю например что такое арккосинус и следовательно перевести это дело в код не могу. Остаётся одна надежда - твоя помошь, прошу помоги...



P.S. Ты ведь фанат Half-Life 2 да? Если так, то да поможет тебе великий Фримен...
Аватара пользователя
XEN_STRANGER

Re: C/C++ - Решение кубических уравнений на С++

Сообщение XEN_STRANGER »

Арккосинус



Цитата XEN_STRANGER:



арккосинус ... в код
C/C++ - Решение кубических уравнений на С++




acos(x)

Вот пример программы

Код:

Код: Выделить всё

#include <stdio.h>
#include <math.h>
int main(int argc,char *argv[])
{
	float x;
		for (x=-1;x<=1;x=x+0.01)
			printf("%f %f\n",x,acos(x));
	return 0;
}

Главное помнить что аргумент функции арккосинус acos()[/i] может быть от -1 до 1 включительно, то есть те значения которые может принимать сам косинус.
Аватара пользователя
Admiral

Re: C/C++ - Решение кубических уравнений на С++

Сообщение Admiral »

Admiral, сдесь ты находил арккосинус от х, а я нахожу от (R/ sqrt(Q^3)), но эт не важно... Я что-то не пойму это цикл, конечный ответ, который будет использоваться дальше в вычислениях, тот, который равен арккосинусу от х или от моего (R/ sqrt(Q^3)) - это последнее решение цикла (сомневаюсь)? Что, все последующие вычисления программы надо вставлять внутрь тела цикла?



Admiral, посмотри на формулу с нахождением арккосинуса по
этой ссылке
и скажи правильно ли я её перевёл:



(кстати что это за зачёркнутый кружок, его можно взять за любую обычную переменную, например U, может это перечисляемая переменная, кажется тип enum ?)





Код:

Код: Выделить всё

#include <stdio.h>
#include <math.h>
int main(int argc,char *argv[])
{
       float x;
       x= (R/ sqrt(Q^3));
       for (x=-1;x<=1;x=x+0.01)
                       cout << x << " = acos of x";
       return 0;
}

Пожалуйсто, зайдите
СЮДА


Пожалуйсто, переведите в код формулы, а там мне почти всё ещё не известно: тригонометрические косинусы (мы изучали пока только геометрические), непонятное слово Arch, ch, sign, sh, переменная "а" под углом корня.

Вобщем очень прошу, зайдите на ту страничку в "Вики" и попробуйте перевести те формулы в код. Изображение
Аватара пользователя
XEN_STRANGER

Re: C/C++ - Решение кубических уравнений на С++

Сообщение XEN_STRANGER »

Admiral, сдесь ты находил арккосинус от х, а я нахожу от (R/ sqrt(Q^3)), но эт не важно... Я что-то не пойму это цикл, конечный ответ, который будет использоваться дальше в вычислениях, тот, который равен арккосинусу от х или от моего (R/ sqrt(Q^3)) - это последнее решение цикла (сомневаюсь)? Что, все последующие вычисления программы надо вставлять внутрь тела цикла?



Admiral, посмотри на формулу с нахождением арккосинуса по
этой ссылке
и скажи правильно ли я её перевёл:



(кстати что это за зачёркнутый кружок, его можно взять за любую обычную переменную, например U, может это перечисляемая переменная, кажется тип enum ?)





Код:

Код: Выделить всё

#include <stdio.h>
#include <math.h>
int main(int argc,char *argv[])
{
       float x;
       x= (R/ sqrt(Q^3));
       for (x=-1;x<=1;x=x+0.01)
                       cout << x << " = acos of x";
       return 0;
}

Пожалуйсто, зайдите
СЮДА


Пожалуйсто, переведите в код формулы, а там мне почти всё ещё не известно: тригонометрические косинусы (мы изучали пока только геометрические), непонятное слово Arch, ch, sign, sh, переменная "а" под углом корня.

Вобщем очень прошу, зайдите на ту страничку в "Вики" и попробуйте перевести те формулы в код. Изображение
Аватара пользователя
XEN_STRANGER

Re: C/C++ - Решение кубических уравнений на С++

Сообщение XEN_STRANGER »

Admiral, crashtuak, Всё вобщем я прогу написал, только при компиляции кода:

Отрывок кода:





Код:

Код: Выделить всё

//----------Кубические уравнения-----------------------------------------------------------------------
int x3yravn ()
{
    cout << "-----NEXT-------------------------------------------------------" << endl;
    double a, b, c, x;
    double error;
    cout << "Ввод уравнения: " << endl;
    cout << endl << "(a=) ";
    cin >> a;
    cout << "(b=) ";
    cin >> b;
    cout << "(c=) ";
    cin >> c;
error = GetX3yravn (x, a, b, c);
    if (!error)
	{
		backer ();
	}
    else
	{
		cout << endl << "Ошибка! а=0 или b=0, уравнение не кубическое" << endl;
	}
	char response;
	cin >> response;
	return 0;
}
// Функция нахождения корней кубического уравнения
double GetX3yravn (double *x,double a,double b,double c)
{
    double value = 0;
    if ((a == 0) || (b == 0))
	value = 1;
    else
    {
        double q, r, q3, r2;
        value = 0;
        q=(a*a-3.*b)/9.; 
        r=(a*(2.*a*a-9.*b)+27.*c)/54.;
        r2=r*r; 
        q3=q*q*q;
        if(r2<q3) 
        { 
	    double t=acos(r/sqrt(q3));
	    a/=3.; 
	    q=-2.*sqrt(q);
                    x[0]=q*cos(t/3.)-a; 
	    x[1]=q*cos((t+M_2PI)/3.)-a;
	    x[2]=q*cos((t-M_2PI)/3.)-a; 
                   cout << "=====РЕЗУЛЬТАТ==================================================";
	    cout << endl << "Найдено три корня, x1 = " << x[0] << ", x2 = " << x[1] << ", x3 = " << x[2] << endl;
                   cout << "================================================================" << endl;
       }
       else
       {
		    double aa,bb;
		    if(r<=0.) r=-r; 
		    aa=-pow(r+sqrt(r2-q3),1./3.);  
		    if(aa!=0.) bb=q/aa; 
		    else bb=0.; 
		    a/=3.; q=aa+bb; r=aa-bb; 
		    x[0]=q-a; 
		    x[1]=(-0.5)*q-a;
	     	    x[2]=(sqrt(3.)*0.5)*fabs(r);
              if(x[2]==0.)
              {
                cout << "=====РЕЗУЛЬТАТ==================================================";
                cout << "Найдено два корня, x2 = " << x[1] << ", x3 = " << x[2] << endl;
                cout << "================================================================" << endl;
              }
	    	cout << "=====РЕЗУЛЬТАТ==================================================";
		cout << "Найден один корень, x = " << x[0] << endl;
                                cout << "================================================================" << endl;
         }
                value = 0; 
     }
    return value; 
}
//-------END-------------------------------------------------------------------------------------

Появляется ошибка: error C2664: 'GetX3yravn' : cannot convert parameter 1 from 'double' to 'double *'

There is no context in which this conversion is possible



Как это исправить?
Аватара пользователя
Drongo

Re: C/C++ - Решение кубических уравнений на С++

Сообщение Drongo »

Код:

Код: Выделить всё

...
double GetX3yravn (double *x, double a, double b, double c) // чего 'x' указател? Когда в обявлении это обычный 'double'
...
Аватара пользователя
XEN_STRANGER

Re: C/C++ - Решение кубических уравнений на С++

Сообщение XEN_STRANGER »

Цитата XEN_STRANGER:



сейчас проверял и нифига, прога запускается, но после ввода a, b, и c вылетает... Что исправить надо?
C/C++ - Решение кубических уравнений на С++




А ты скинь код, который ты проверял, чтобы воспроизвести ошибку и посмотреть ей в "лицо". Изображение





Код:

Код: Выделить всё

error = GetX3yravn (x, a, b, c);  // Поставь точку остановки выполнения тут, и посмотри, будет ли вылетать или нет
Аватара пользователя
Drongo

Re: C/C++ - Решение кубических уравнений на С++

Сообщение Drongo »

Drongo,
Цитата Drongo:



Поставь точку остановки выполнения тут, и посмотри, будет ли вылетать или нет
C/C++ - Решение кубических уравнений на С++




Как ? Покажи



Тоесть дальше всё выключить?
Аватара пользователя
XEN_STRANGER

Re: C/C++ - Решение кубических уравнений на С++

Сообщение XEN_STRANGER »

Выдели в редакторе строку или поставь курсор на нужную стоку и нажми F5
Ответить

Вернуться в «Программирование и базы данных»