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

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

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

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

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

Помощь нужна! кто можеть помогите
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2012, 11:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нахождение корней уравнения методом обратного интерполирования (C++):

Нахождение корней уравнения методом обратного интерполирования - C++
Pomogite pojaluista napisat na C++ . . . zARANEE sPASIBO :)))

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

Нахождение корней уравнения - C++
Помогите написать программу по выводу корней из уравнения: f(x)=4\ast \sin \left(x \right)^4+2\ast \cos \left(x \right)^3+2 "Шапку" я...

Нахождение корней уравнения - C++
Программа находит все корни уравнения и записывает в динамический массив. #include <stdio.h> #include <math.h> #include <iostream>...

Нахождение корней уравнения - C++
Задачи решенные тремя разными способами #include <conio.h> #include <math.h> #include <iostream.h> #define pi 3.14 double...

Нахождение корней квадратного уравнения - C++
Здравствуйте , показывает ошибку в этих строчках,ругается на функции sqrt и pow объясните почему именно, заранее спасибо z =...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
UFO94
264 / 253 / 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
264 / 253 / 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
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
17.05.2012, 11:12 #6
Окей. Самый грубый вариант. Интерполяция прямыми.
1) Делаем разбиение оси x, и делаем табличку x | y. От каждой точки к каждой следующей проводим отрезок. Итого, мы заменили функцию ломаной.
2) Смотрим, где коэфициент прямой меняется с положительного на отрицательный или наоборот. Это -- точка экстремума. Между экстремумами -- промежутки монотонности.
3) Проверяем промежутки монотонности, нас интересуют только те, у которых на концах функция разных знаков.
4) На каждом таком промежутке можно сделать новое, более точное разбиение, но это не обязательно. В итоге, у нас есть табличка x | y (старая или только что полученая), мы на нее смотрим как на табличку y | x, и делаем интерполяцию (эту желательно поточнее). Далее ищем, чему равна наша интерполяция в точке 0. И ответ готов.
Программу просто писать долго...
UFO94
264 / 253 / 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
264 / 253 / 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
264 / 253 / 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
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
07.11.2012, 13:20 #13
Переносишь все в правую сторону и получаешь уравнение вида F(x)=0
_Лёша_
378 / 368 / 20
Регистрация: 08.02.2011
Сообщений: 1,073
09.11.2012, 21:38 #14
Цитата Сообщение от UFO94 Посмотреть сообщение
Переносишь все в правую сторону и получаешь уравнение вида F(x)=0
уже не актуально)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 21:38
Привет! Вот еще темы с ответами:

Нахождение корней квадратного уравнения - C++
Здравствуйте все кто читает эти строки! Большой привет вам из раздела Delphi! Моему другу появилось необходимость написать прогу на...

Нахождение корней квадратного уравнения С++ - C++
Как найти корни квадратного уравнения С++?Задаются ведь значения x.y.z,а на выходе выводится значение корней. С++.Новичок.Буду...

Нахождение корней методом Ньютона - C++
Нужно написать программу вычисляющую корень полинома методом Ньютона. Подскажите, как можно описать функцию...

Нахождение корней квадратного уравнения через дискриминант - C++
Здравствуйте! Начинаю работать в C++ Builder 3.1 в DOSBOXe. Стоит задача реализовать программу нахождения корней квадратного уравнения...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.11.2012, 21:38
Ответ Создать тему
Опции темы

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