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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ошибка в скобке? http://www.cyberforum.ru/cpp-beginners/thread575020.html
#include <conio.h> #include <iostream.h> #include <cmath.h> main() { double a, z2, z1, x, y;
C++ Найти количество слов, оканчивающихся на мягкий знак Дано предложение без знаков препинания. Составить программу поиска количества слов, оканчивающихся на мягкий знак. Как произвести поиск, что бы считалось количество, только тех слов, которые... http://www.cyberforum.ru/cpp-beginners/thread575017.html
C++ таблица
дана таблица a содержащая числа 0,1,5 или 11. Посчитать количество четверок a,a,a в каждой из которых все элементы разные, нужно решение на С++ помогите пожалуйста
Найти наименьшее натуральное число, которое отсутствует в последовательности и определить его делители. C++
Дана последовательность натуральных чисел. Найти наименьшее натуральное число, которое отсутствует в последовательности и определить его делители.
C++ Странности с чтением объекта структуры из файла http://www.cyberforum.ru/cpp-beginners/thread574965.html
Почему-то возникают проблемы с чтением объектов структуры из файла. Структура struct Item { Item(int k,const char* ch, Item* n=NULL) :key(k),info(new char),next(n) { ...
C++ Добавить в конец непустой очереди все ее элементы, располагая их в обратном порядке Добавить в конец непустой очереди все ее элементы, располагая их в обратном порядке. подробнее

Показать сообщение отдельно
UFO94
264 / 253 / 13
Регистрация: 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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru