Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/30: Рейтинг темы: голосов - 30, средняя оценка - 4.63
 Аватар для Betokuha
32 / 29 / 1
Регистрация: 05.03.2012
Сообщений: 114

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

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

Студворк — интернет-сервис помощи студентам
Помощь нужна! кто можеть помогите
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.05.2012, 11:08
Ответы с готовыми решениями:

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

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

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

13
 Аватар для UFO94
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
15.05.2012, 17:27
1) Определяете отрезок, на котором:
а) Лежит ваш корень
б) Функция взаимооднозначна
2) Делаете разбиение по x в зависимости от заданой точности
3) Делаете интерполяцию для функции x(y).
4) Находите ее значение в точке y=0.
P.S.: Этот вопрос ближе к численным методам, чем к вопросам по c\c++
1
 Аватар для Betokuha
32 / 29 / 1
Регистрация: 05.03.2012
Сообщений: 114
15.05.2012, 18:03  [ТС]
Spasibo , mne nado programma na C++
0
 Аватар для UFO94
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
15.05.2012, 18:09
А интерполяция чем?
0
 Аватар для Betokuha
32 / 29 / 1
Регистрация: 05.03.2012
Сообщений: 114
16.05.2012, 07:10  [ТС]
hehe я не знаю точно, задача такая дана
0
 Аватар для UFO94
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
17.05.2012, 11:12
Окей. Самый грубый вариант. Интерполяция прямыми.
1) Делаем разбиение оси x, и делаем табличку x | y. От каждой точки к каждой следующей проводим отрезок. Итого, мы заменили функцию ломаной.
2) Смотрим, где коэфициент прямой меняется с положительного на отрицательный или наоборот. Это -- точка экстремума. Между экстремумами -- промежутки монотонности.
3) Проверяем промежутки монотонности, нас интересуют только те, у которых на концах функция разных знаков.
4) На каждом таком промежутке можно сделать новое, более точное разбиение, но это не обязательно. В итоге, у нас есть табличка x | y (старая или только что полученая), мы на нее смотрим как на табличку y | x, и делаем интерполяцию (эту желательно поточнее). Далее ищем, чему равна наша интерполяция в точке 0. И ответ готов.
Программу просто писать долго...
1
 Аватар для UFO94
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
23.05.2012, 01:39
Например, у нас уже есть отрезок монотонности функции. [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;
}
2
 Аватар для UFO94
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
25.05.2012, 13:15
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;
}
2
Бекмырза
15.06.2012, 17:47
Betokuha, У меня такая же тема по курсовой. Если сделаешь скинь мне или напиши в скайп или же http://vk.com/id101332538
 Аватар для UFO94
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
15.06.2012, 19:28
Бекмырза, так а что собственно надо? Код -- вот он! Просто вписываешь в функцию F подсчет значения твоей функции.
0
Бекмырза
16.06.2012, 18:42
UFO94, У меня чуток другая тема курсовой. "Нахождение корней нелинейного уравнения методом обратного интерполирования". Что делать? В чем разница?
 Аватар для _Лёша_
388 / 377 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
03.11.2012, 22:55
Цитата Сообщение от UFO94 Посмотреть сообщение
Бекмырза, так а что собственно надо? Код -- вот он! Просто вписываешь в функцию F подсчет значения твоей функции.
А если у меня просто задание "Нахождение корней уравнения методом обратного интерполирования." без функций, то как мне быть? Не могли бы вы написать рабочий пример какой-нибудь, а то я не могу найти никакой инфы по этому методу и, что еще хуже знаю только vb.net, спасибо заранее!
0
 Аватар для UFO94
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
07.11.2012, 13:20
Переносишь все в правую сторону и получаешь уравнение вида F(x)=0
1
 Аватар для _Лёша_
388 / 377 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
09.11.2012, 21:38
Цитата Сообщение от UFO94 Посмотреть сообщение
Переносишь все в правую сторону и получаешь уравнение вида F(x)=0
уже не актуально)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.11.2012, 21:38
Помогаю со студенческими работами здесь

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

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

Нахождение корней квадратного уравнения
Знаю, что на эту тему уже много было написано, но мне нужно точное решение задачи, поскольку проверяет её компьютер. Входные данные: ...

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru