Форум программистов, компьютерный форум 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) { strcpy(info,ch); length=strlen(info)+1; }
C++ Добавить в конец непустой очереди все ее элементы, располагая их в обратном порядке Добавить в конец непустой очереди все ее элементы, располагая их в обратном порядке. подробнее

Показать сообщение отдельно
UFO94
 Аватар для UFO94
263 / 252 / 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;
}
 
Текущее время: 13:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru