Форум программистов, компьютерный форум CyberForum.ru

Метод Лобачевского-Греффе. Допилить код на C++ или перенести с Pascal - C++

Восстановить пароль Регистрация
 
tvventyseven
0 / 0 / 0
Регистрация: 22.08.2011
Сообщений: 3
03.12.2013, 13:02     Метод Лобачевского-Греффе. Допилить код на C++ или перенести с Pascal #1
Всем привет.

Дано:
1) Программа на C++ для решения алгебраического уравнения с одной парой комплексных корней методом Лобачевского-Греффе

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <tchar.h>
#include <stdio.h>
#include <iostream>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <windows.h>
 
 
using namespace std;
int main()
{   SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    long double a0, a1, a2, a3, a4;
    long double b0, b1, b2, b3, b4;
    long double b00, b11, b22, b33, b44;
    long double x1,x2,x3,x4;
    long double r,u,v;
    a0 = 1.0;
    a1 = -4.0;
    a2 = -9.0;
    a3 = 26.0;
    a4 = -30.0;
    //------------------------------//
        b0 = pow(a0,2);
        b1 = pow(a1,2) - 2*pow(a0,1)*pow(a2,1);
        b2 = pow(a2,2) - 2*pow(a1,1)*pow(a3,1) + 2*pow(a0,1)*pow(a4,1);
        b3 = pow(a3,2) - 2*pow(a2,1)*pow(a4,1);
        b4 = pow(a4,2);
        cout << "\tСтепень 2" << "\n";
        cout << b0 << "\n";
        cout << b1 << "\n";
        cout << b2 << "\n";
        cout << b3 << "\n";
        cout << b4 << "\n";
    for (double i = 1; i < 6; i++) {
        b00 = b0;
        b11 = b1;
        b22 = b2;
        b33 = b3;
        b44 = b4;
        b0 = pow(b00,2);
        b1 = pow(b11,2) - 2*pow(b00,1)*pow(b22,1);
        b2 = pow(b22,2) - 2*pow(b11,1)*pow(b33,1) + 2*pow(b00,1)*pow(b44,1);
        b3 = pow(b33,2) - 2*pow(b22,1)*pow(b44,1);
        b4 = pow(b44,2);
        cout << "\tСтепень " << pow(2,i+1) << "\n";
        cout << b0 << "\n";
        cout << b1 << "\n";
        cout << b2 << "\n";
        cout << b3 << "\n";
        cout << b4 << "\n";
    }
        b00 = b1/b0;
        b11 = b2/b1;
        b22 = b3/b2;
        b33 = b4/b3;
        long double m = 1.0/64.0;
        double pod0 = 0;
        double pod1 = 0;
 
        b00 = pow(b00,m);
        b11 = pow(b11,m);
        b22 = pow(b22,m);
        b33 = pow(b33,m);
 
        cout << "\tТочные корни:\n";
        cout << "x1 = +-" << b00 << "\n";
        cout << "x2 = +-" << b11 << "\n";
        cout << "Подстановка найденых корней в уравнение(проверка близости к нулю)\n";
 
        pod0 = pow(-b00,4) - 4*pow(-b00,3) - 9*pow(-b00,2) + 26*pow(-b00,1) - 30;
        pod1 = pow(b00,4) - 4*pow(b00,3) - 9*pow(b00,2) + 26*pow(b00,1) - 30;
 
        if (fabs(pod0) <= 0.0000000001) {
            cout << "x1 =  " << -b00 << "\t\t" << pod0 << "\n";
            x1 = -b00;
        } else
           {    cout << "x1 =  " <<  b00 << "\t\t" << pod1 << "\n";
                x1 = b00;
           }
 
        pod0 = pow(-b11,4) - 4*pow(-b11,3) - 9*pow(-b11,2) + 26*pow(-b11,1) - 30;
        pod1 = pow(b11,4) - 4*pow(b11,3) - 9*pow(b11,2) + 26*pow(b11,1) - 30;
 
        if (fabs(pod0) <= 0.0000000001) {
            cout << "x2 = " << -b11 << "\t\t"<< pod0 << "\n";
            x2 = -b11;
 
        } else
            {cout << "x2 = " <<  b11 << "\t\t"<< pod1 << "\n";
             x2 = b11;
            }
 
        r = pow((b33/b22),m);
        u = -(a1/(2*a0))-(1.0/2.0)*(x1+x2);
        v = pow((r*r - u*u),(1/2));
 
        cout << "\tКомплексные корни:\n";
        cout << "x3 = " << u << " + " << u << "*i";
        cout << "\nx4 = " << u << " - " << u << "*i";
    //------------------------------//
    getch();
    return 0;
}

2) Программа на Pascal. Полностью готова и решает что надо. Надо перенести на C++.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
program rgr_method_lobachevskogo_greffe;
var a0,a1,a2,a3,a4,k,m,i,max2,max: integer;
Y0:array[1..10] of real;
Y1:array[1..10] of real;
Y2:array[1..10] of real;
Y3:array[1..10] of real;
Y4:array[1..10] of real;
E,r1,r2,x1,x2,x3,u1,u2,v1,v2,r11,r22,mark1,mark2:real;
st1,st2:String;
FUNCTION eq(S1,S2:String):boolean;
var k,j:integer;
Begin
if length(S1)=length(S2) then
for k:=1 to 4 do
begin
if (S1[k]=S2[k]) then if (k=4) then eq:=true;
if (S1[k]<>S2[k]) then
begin
eq:=false;
break;
end;
end;
if length(S1)<>length(S2) then eq:=false;
end;
 
Begin
a0:=1;
a1:=2;
a2:=2;
a3:=-8;
a4:=16;
Y0[1]:=a0;
Y1[1]:=a1;
Y2[1]:=a2;
Y3[1]:=a3;
Y4[1]:=a4;
write('stepeni    x^4    x^3   x^2   x^1   x^0 ');
k:=1;
writeln;
write(1,'          ',Y0[k],'       ',Y1[k],'     ',Y2[k],'     ',Y3[k],'    ', Y4[k]);
writeln;
m:=2;
str(Y2[k]*Y2[k],st1);
str(Y2[k+1],st2);
repeat
Y0[k+1]:=sqr(Y0[k]);
Y1[k+1]:=sqr(Y1[k])-2*Y0[k]*Y2[k];
Y2[k+1]:=sqr(Y2[k])-2*Y1[k]*Y3[k]+2*Y0[k]*Y4[k];
Y3[k+1]:=sqr(Y3[k])-2*Y2[k]*Y4[k];
Y4[k+1]:=sqr(Y4[k]);
str(Y2[k]*Y2[k],st1);
str(Y2[k+1],st2);
if (not eq(st1,st2)) then
write(m,'          ',Y0[k+1],'  ',Y1[k+1],'  ',Y2[k+1],'  ',Y3[k+1],'  ', Y4[k+1]);
m:=m*2;
k:=k+1;
writeln;
until (eq(st1,st2));
r1:=Y2[k-1]/Y0[k-1];
for i:=1 to 4 do
r1:=sqrt(r1);
r2:=Y4[k-1]/Y2[k-1];
for i:=1 to 4 do
r2:=sqrt(r2);
r11:=1/r1;
r22:=1/r2;
writeln('moduli ',r1,' ',r2);
u2:=1/(r22-r11)*(r11*Y1[1]/(2*Y0[1])-Y3[1]/(2*Y4[1]));
u1:=-Y1[1]/(2*Y0[1])-u2;
writeln('deystvytelnye chasti ',u2,'  ',u1);
v1:=sqrt(r1-sqr(u1));
v2:=sqrt(r2-sqr(u2));
writeln('mnimye chasti ',v1,'  ',v2);
max2:=abs(a0);
if max2<abs(a1) then max2:=abs(a1);
if max2<abs(a2) then max2:=abs(a2);
if max2<abs(a3) then max2:=abs(a3);
max:=abs(a1);
if max<abs(a2) then max:=abs(a2);
if max<abs(a3) then max:=abs(a3);
if max<abs(a4) then max:=abs(a4);
mark1:=1+max/abs(a0);
mark2:=1/(1+max2/abs(a4));
if ((sqrt(sqr(u1)+sqr(v1))>mark2) and (sqrt(sqr(u1)+sqr(v1))<mark1) and (sqrt(sqr(u2)+sqr(v2))<mark1) and  (sqrt(sqr(u2)+sqr(v2))>mark2)) then
begin
writeln('Korni uravneniya ',u1:2:3,'+-',v1:2:3,'i');
writeln(u2:2:3,'+-',v2:2:3,'i');
writeln('korni udovletvoryaut verhney ocenke moduley ',mark1,' i nizhnei ocenke ', mark2);
end
else write('proizoshla oshibka vychislenyi');
end.

Задача: Запрограммировать решение алгебраического уравнения с двумя парами комплексных корней методом Лобачевского-Греффе.

P.S.: Я не программист и не хочу им быть. И поэтому не смогу вам отплатить ценным советом. Зато могу скинуть на пиво/сок.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2013, 13:02     Метод Лобачевского-Греффе. Допилить код на C++ или перенести с Pascal
Посмотрите здесь:

C++ Задача на минимизацию ДНФ, нужен код на С или Pascal!!!
C++ Код Pascal на С
C++ Код из Pascal в С
C++ Пмогите допилить програмку
C++ портировать программу с графиком из Pascal в С++(метод наименьших квадратов)
C++ Метод наименьших квадратов! (с Pascal на C++)
C++ Из кода Pascal в код C++
Нахождения корней уравнения: метод половинного деления (бисекции) или метод хорд C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 18:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru