Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Решение кубических уравнений на С++

Ответить
Настройки темы
C/C++ - Решение кубических уравнений на С++

Аватара для XEN_STRANGER

Старожил


Сообщения: 158
Благодарности: 4

Профиль | Отправить PM | Цитировать


Изменения
Автор: XEN_STRANGER
Дата: 23-02-2011
Само объяснение есть, вот - 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/

Отправлено: 20:51, 30-03-2009

 

Аватара для XEN_STRANGER

Старожил


Сообщения: 158
Благодарности: 4

Профиль | Отправить PM | Цитировать


crashtuak,
Цитата crashtuak:
Вот Тригонометрическая Формула Виета, первый раз вижу, но она сравнительно легкая, и почти идеально подходит для реализации на С++: http://ru.wikipedia.org/wiki/%D0%A2%...B5%D1%82%D0%B0 »
Ты наверное школу уже закончил, может в универе учишься, может в классе 11-ом, тоесть тригонометрию уже изучаешь, а я пока ещё "не дорос" и не знаю например что такое арккосинус и следовательно перевести это дело в код не могу. Остаётся одна надежда - твоя помошь, прошу помоги...

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

Отправлено: 21:15, 30-03-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Арккосинус
Цитата XEN_STRANGER:
арккосинус ... в код »
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() может быть от -1 до 1 включительно, то есть те значения которые может принимать сам косинус.

Отправлено: 03:31, 31-03-2009 | #3


Аватара для XEN_STRANGER

Старожил


Сообщения: 158
Благодарности: 4

Профиль | Отправить PM | Цитировать


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, переменная "а" под углом корня.
Вобщем очень прошу, зайдите на ту страничку в "Вики" и попробуйте перевести те формулы в код.

Отправлено: 08:38, 31-03-2009 | #4


Аватара для XEN_STRANGER

Старожил


Сообщения: 158
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Как это исправить?

Отправлено: 13:20, 31-03-2009 | #5


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 13:33, 31-03-2009 | #6


Аватара для XEN_STRANGER

Старожил


Сообщения: 158
Благодарности: 4

Профиль | Отправить PM | Цитировать


Drongo, А... ясно, спасибо, посмотри плиз на код, он вообще верный, в плане решения уравнений?

Drongo, сейчас проверял и нифига, прога запускается, но после ввода a, b, и c вылетает...
Что исправить надо?

Отправлено: 13:48, 31-03-2009 | #7


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата XEN_STRANGER:
сейчас проверял и нифига, прога запускается, но после ввода a, b, и c вылетает... Что исправить надо? »
А ты скинь код, который ты проверял, чтобы воспроизвести ошибку и посмотреть ей в "лицо".

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

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 14:33, 31-03-2009 | #8


Аватара для XEN_STRANGER

Старожил


Сообщения: 158
Благодарности: 4

Профиль | Отправить PM | Цитировать


Drongo,
Цитата Drongo:
Поставь точку остановки выполнения тут, и посмотри, будет ли вылетать или нет »
Как ? Покажи

Тоесть дальше всё выключить?

Отправлено: 15:25, 31-03-2009 | #9


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 16:04, 31-03-2009 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Решение кубических уравнений на С++

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - Решение квадратных уравнений на С++ ShadowMas Программирование и базы данных 29 20-05-2011 17:23
Wireless - Посоветуйте WI-FI решение. krec Сетевое оборудование 2 29-06-2009 10:39
Теория - Решение системы уравнений quaker_strelok Программирование и базы данных 3 23-09-2007 14:29
*Теория* | Решение системы линейных уравнений DeadBoy Программирование и базы данных 5 23-02-2005 17:12
Терминальное решение Baboon Сетевые технологии 2 06-10-2003 17:13




 
Переход