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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Betokuha
32 / 29 / 9
Регистрация: 05.03.2012
Сообщений: 114
#1

Нахождение корней уравнения методом обратного интерполирования - C++

15.05.2012, 11:08. Просмотров 2212. Ответов 13
Метки нет (Все метки)

Помощь нужна! кто можеть помогите
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2012, 11:08     Нахождение корней уравнения методом обратного интерполирования
Посмотрите здесь:
Нахождение корней уравнения методом обратного интерполирования C++
C++ Нужен исходник с++(Нахождение корней уравнения методом обратного интерполирования)
Нахождение корней уравнения C++
Нахождение корней уравнения C++
Нахождение корней уравнения C++
C++ Нахождение корней квадратного уравнения
Нахождение корней квадратного уравнения C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
15.05.2012, 17:27     Нахождение корней уравнения методом обратного интерполирования #2
1) Определяете отрезок, на котором:
а) Лежит ваш корень
б) Функция взаимооднозначна
2) Делаете разбиение по x в зависимости от заданой точности
3) Делаете интерполяцию для функции x(y).
4) Находите ее значение в точке y=0.
P.S.: Этот вопрос ближе к численным методам, чем к вопросам по c\c++
Betokuha
32 / 29 / 9
Регистрация: 05.03.2012
Сообщений: 114
15.05.2012, 18:03  [ТС]     Нахождение корней уравнения методом обратного интерполирования #3
Spasibo , mne nado programma na C++
UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
15.05.2012, 18:09     Нахождение корней уравнения методом обратного интерполирования #4
А интерполяция чем?
Betokuha
32 / 29 / 9
Регистрация: 05.03.2012
Сообщений: 114
16.05.2012, 07:10  [ТС]     Нахождение корней уравнения методом обратного интерполирования #5
hehe я не знаю точно, задача такая дана
UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
17.05.2012, 11:12     Нахождение корней уравнения методом обратного интерполирования #6
Окей. Самый грубый вариант. Интерполяция прямыми.
1) Делаем разбиение оси x, и делаем табличку x | y. От каждой точки к каждой следующей проводим отрезок. Итого, мы заменили функцию ломаной.
2) Смотрим, где коэфициент прямой меняется с положительного на отрицательный или наоборот. Это -- точка экстремума. Между экстремумами -- промежутки монотонности.
3) Проверяем промежутки монотонности, нас интересуют только те, у которых на концах функция разных знаков.
4) На каждом таком промежутке можно сделать новое, более точное разбиение, но это не обязательно. В итоге, у нас есть табличка x | y (старая или только что полученая), мы на нее смотрим как на табличку y | x, и делаем интерполяцию (эту желательно поточнее). Далее ищем, чему равна наша интерполяция в точке 0. И ответ готов.
Программу просто писать долго...
UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
23.05.2012, 01:39     Нахождение корней уравнения методом обратного интерполирования #7
Например, у нас уже есть отрезок монотонности функции. [a;b]. Тогда делаем так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
float acc=0;
//Делаем ввод точности с клавиатуры. Точность не менее 0.000001
float h=sqrt(acc);//Шаг разбиения
int n=(b-a)/h+1;
float* x=new float[n];
float* y=new float[n];
for(int i=0; i<n; i++)
{
x[i]=a+i*h;
y[i]=F(x);//float F(float x) -- ваша функция
}
float y0=spline(y,x,n,0);//y0 -- ответ
Функция spline:
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
float spline(float* x, float* y, int n, float x0)//Интерполяция таблицы x,y (n точек) сплайнами и нахождение значения сплайна в точке x0
{
    float* *a=new float*[n-2];
            for(int i=0; i<n-2; i++)
            {
                a[i]=new float[n-2];
                for(int j=0; j<n-2; j++)
                    if(i==j)
                        a[i][j]=(x[i+2]-x[i])/3;
                    else if(i==j+1)
                        a[i][j]=(x[i+1]-x[i])/6;
                    else if(i==j-1)
                        a[i][j]=(x[i+2]-x[i+1])/6;
                    else a[i][j]=0;
            }
            float* b=new float[n-2];
            for(int i=0; i<n-2; i++)
                b[i]=(y[i+2]-y[i+1])/(x[i+2]-x[i+1])-(y[i+1]-y[i])/(x[i+1]-x[i]);
            float* y1=calc(a,b,n-2);
            delete b;
            b=new float[n];
            for(int i=1; i<n-1; i++)
                b[i]=y1[i-1];
            b[0]=0;
            b[n-1]=0;
            delete y1;
            float* *coef=new float*[n-1];
            for(int i=0; i<n-1; i++)
                coef[i]=new float[4];
            for(int i=0; i<n-1; i++)
            {
                coef[i][0]=(b[i+1]-b[i])/(6*(x[i+1]-x[i]));
                coef[i][1]=-(b[i+1]*x[i]-b[i]*x[i+1])/(2*(x[i+1]-x[i]));
                coef[i][2]=(b[i+1]*x[i]*x[i]-b[i]*x[i+1]*x[i+1])/(2*(x[i+1]-x[i]));
                coef[i][3]=-(b[i+1]*x[i]*x[i]*x[i]-b[i]*x[i+1]*x[i+1]*x[i+1])/(6*(x[i+1]-x[i]));
                coef[i][2]+=(b[i]-b[i+1])*(x[i+1]-x[i])/6;
                coef[i][3]+=(b[i+1]*x[i]-b[i]*x[i+1])*(x[i+1]-x[i])/6;
                coef[i][2]+=(y[i+1]-y[i])/(x[i+1]-x[i]);
                coef[i][3]+=(y[i]*x[i+1]-y[i+1]*x[i])/(x[i+1]-x[i]);
            }
            delete b;
            delete a;
            delete y;
            for(int i=0; i<n-1; i++)
                if(((x0>=x[i])&&(x0<=x[i+1]))||((x0<=x[i])&&(x0>=x[i+1])))
                {
                    float y0=((coef[i][0]*x0+coef[i][1])*x0+coef[i][2])*x0+coef[i][3];
                    return y0;
                }
}
Функция calc:
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
float* calc(float* *a,float* b, int n)//Нахождение решения матричного уравнения A*|x>=|b> методом LU-разбиения
{
float* *l=new float*[n];
float* *u=new float*[n];
for(int i=0; i<n; i++)
{
    u[i]=new float[n];
    l[i]=new float[n];
    for(int j=0; j<n; j++)
    {
        u[i][j]=0;
        l[i][j]=0;
    }
}
for(int i=0; i<n; i++)
{
    u[i][i]=1;
    for(int j=i; j<n; j++)
    {
        l[j][i]=a[j][i];
        for(int k=0; k<i; k++)
            l[j][i]=l[j][i]-l[j][k]*u[k][i];
    }
    for(int j=i+1; j<n; j++)
    {
        u[i][j]=a[i][j];
        for(int k=0; k<i; k++)
            u[i][j]=u[i][j]-l[i][k]*u[k][j];
        u[i][j]=u[i][j]/l[i][i];
    }
}
float* y=new float[n];
for(int i=0; i<n; i++)
{
    y[i]=b[i];
    for(int j=0; j<i; j++)
        y[i]=y[i]-l[i][j]*y[j];
    y[i]=y[i]/l[i][i];
}
float* x=new float[n];
for(int i=n-1; i>=0; i--)
{
    x[i]=y[i];
    for(int j=i+1; j<n; j++)
        x[i]=x[i]-u[i][j]*x[j];
    x[i]=x[i]/u[i][i];
}
delete l;
delete u;
delete y;
return x;
}
UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
25.05.2012, 13:15     Нахождение корней уравнения методом обратного интерполирования #8
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <stdio.h>
#include <conio.h>
 
float F(float x)
{
//Пишете сюда вычисление значения своей функции
}
 
float spline(float* x, float* y, int n, float x0)//Интерполяция таблицы x,y (n точек) сплайнами и нахождение значения сплайна в точке x0
{
    float* *a=new float*[n-2];
            for(int i=0; i<n-2; i++)
            {
                a[i]=new float[n-2];
                for(int j=0; j<n-2; j++)
                    if(i==j)
                        a[i][j]=(x[i+2]-x[i])/3;
                    else if(i==j+1)
                        a[i][j]=(x[i+1]-x[i])/6;
                    else if(i==j-1)
                        a[i][j]=(x[i+2]-x[i+1])/6;
                    else a[i][j]=0;
            }
            float* b=new float[n-2];
            for(int i=0; i<n-2; i++)
                b[i]=(y[i+2]-y[i+1])/(x[i+2]-x[i+1])-(y[i+1]-y[i])/(x[i+1]-x[i]);
            float* y1=calc(a,b,n-2);
            delete b;
            b=new float[n];
            for(int i=1; i<n-1; i++)
                b[i]=y1[i-1];
            b[0]=0;
            b[n-1]=0;
            delete y1;
            float* *coef=new float*[n-1];
            for(int i=0; i<n-1; i++)
                coef[i]=new float[4];
            for(int i=0; i<n-1; i++)
            {
                coef[i][0]=(b[i+1]-b[i])/(6*(x[i+1]-x[i]));
                coef[i][1]=-(b[i+1]*x[i]-b[i]*x[i+1])/(2*(x[i+1]-x[i]));
                coef[i][2]=(b[i+1]*x[i]*x[i]-b[i]*x[i+1]*x[i+1])/(2*(x[i+1]-x[i]));
                coef[i][3]=-(b[i+1]*x[i]*x[i]*x[i]-b[i]*x[i+1]*x[i+1]*x[i+1])/(6*(x[i+1]-x[i]));
                coef[i][2]+=(b[i]-b[i+1])*(x[i+1]-x[i])/6;
                coef[i][3]+=(b[i+1]*x[i]-b[i]*x[i+1])*(x[i+1]-x[i])/6;
                coef[i][2]+=(y[i+1]-y[i])/(x[i+1]-x[i]);
                coef[i][3]+=(y[i]*x[i+1]-y[i+1]*x[i])/(x[i+1]-x[i]);
            }
            delete b;
            delete a;
            delete y;
            for(int i=0; i<n-1; i++)
                if(((x0>=x[i])&&(x0<=x[i+1]))||((x0<=x[i])&&(x0>=x[i+1])))
                {
                    float y0=((coef[i][0]*x0+coef[i][1])*x0+coef[i][2])*x0+coef[i][3];
                    return y0;
                }
}
 
float* calc(float* *a,float* b, int n)//Нахождение решения матричного уравнения A*|x>=|b> методом LU-разбиения
{
float* *l=new float*[n];
float* *u=new float*[n];
for(int i=0; i<n; i++)
{
    u[i]=new float[n];
    l[i]=new float[n];
    for(int j=0; j<n; j++)
    {
        u[i][j]=0;
        l[i][j]=0;
    }
}
for(int i=0; i<n; i++)
{
    u[i][i]=1;
    for(int j=i; j<n; j++)
    {
        l[j][i]=a[j][i];
        for(int k=0; k<i; k++)
            l[j][i]=l[j][i]-l[j][k]*u[k][i];
    }
    for(int j=i+1; j<n; j++)
    {
        u[i][j]=a[i][j];
        for(int k=0; k<i; k++)
            u[i][j]=u[i][j]-l[i][k]*u[k][j];
        u[i][j]=u[i][j]/l[i][i];
    }
}
float* y=new float[n];
for(int i=0; i<n; i++)
{
    y[i]=b[i];
    for(int j=0; j<i; j++)
        y[i]=y[i]-l[i][j]*y[j];
    y[i]=y[i]/l[i][i];
}
float* x=new float[n];
for(int i=n-1; i>=0; i--)
{
    x[i]=y[i];
    for(int j=i+1; j<n; j++)
        x[i]=x[i]-u[i][j]*x[j];
    x[i]=x[i]/u[i][i];
}
delete l;
delete u;
delete y;
return x;
}
 
int main()
{
printf("Input borders of interval\n");
float a=0;
float b=0;
scanf("%f%f",&a,&b);
float tol=0;
printf("Input tolerance\n");
scanf("%f",&tol);
float h=sqrt(acc);//Шаг разбиения
int n=(b-a)/h+1;
float* x=new float[n];
float* y=new float[n];
for(int i=0; i<n; i++)
{
x[i]=a+i*h;
y[i]=F(x);//float F(float x) -- ваша функция
}
float y0=spline(y,x,n,0);//y0 -- ответ
printf("Radical is %f\n",y0);
getch();
return 0;
}
Бекмырза
Сообщений: n/a
15.06.2012, 17:47     Нахождение корней уравнения методом обратного интерполирования #9
Betokuha, У меня такая же тема по курсовой. Если сделаешь скинь мне или напиши в скайп или же http://vk.com/id101332538
UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
15.06.2012, 19:28     Нахождение корней уравнения методом обратного интерполирования #10
Бекмырза, так а что собственно надо? Код -- вот он! Просто вписываешь в функцию F подсчет значения твоей функции.
Бекмырза
Сообщений: n/a
16.06.2012, 18:42     Нахождение корней уравнения методом обратного интерполирования #11
UFO94, У меня чуток другая тема курсовой. "Нахождение корней нелинейного уравнения методом обратного интерполирования". Что делать? В чем разница?
_Лёша_
378 / 368 / 20
Регистрация: 08.02.2011
Сообщений: 1,073
03.11.2012, 22:55     Нахождение корней уравнения методом обратного интерполирования #12
Цитата Сообщение от UFO94 Посмотреть сообщение
Бекмырза, так а что собственно надо? Код -- вот он! Просто вписываешь в функцию F подсчет значения твоей функции.
А если у меня просто задание "Нахождение корней уравнения методом обратного интерполирования." без функций, то как мне быть? Не могли бы вы написать рабочий пример какой-нибудь, а то я не могу найти никакой инфы по этому методу и, что еще хуже знаю только vb.net, спасибо заранее!
UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
07.11.2012, 13:20     Нахождение корней уравнения методом обратного интерполирования #13
Переносишь все в правую сторону и получаешь уравнение вида F(x)=0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 21:38     Нахождение корней уравнения методом обратного интерполирования
Еще ссылки по теме:
C++ Нахождение корней квадратного уравнения С++
Нахождение корней методом Ньютона C++
C++ Нахождение корней квадратного уравнения через дискриминант
Нахождение комплексных корней методом Ньютона C++
Нахождение целых корней многочлена методом Горнера C++

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

Или воспользуйтесь поиском по форуму:
_Лёша_
378 / 368 / 20
Регистрация: 08.02.2011
Сообщений: 1,073
09.11.2012, 21:38     Нахождение корней уравнения методом обратного интерполирования #14
Цитата Сообщение от UFO94 Посмотреть сообщение
Переносишь все в правую сторону и получаешь уравнение вида F(x)=0
уже не актуально)
Yandex
Объявления
09.11.2012, 21:38     Нахождение корней уравнения методом обратного интерполирования
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru