Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Нарушитель
4144 / 1698 / 242
Регистрация: 01.05.2013
Сообщений: 7,452
1

Поиск корня уравнения методом половинного деления и методом хорд

16.12.2018, 01:05. Показов 951. Ответов 3
Метки нет (Все метки)

Нужно найти корень уравнения ctg(1,05x)-x^2=0 в отрезке [a,b]. что-то не получается седлать это методом хорд. Поможите ?
Вот,что я написал
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#define eps 1.0e-4
 
double f(float x) {
    return cos(1.05*x)/sin(1.05*x)-x*x;
}
 
int main() {
    int s;
    float a,b,c,k,x=0;
    setlocale(LC_ALL,"Rus");
    printf ("Дано уравнение ctg(1,05x)-x*x.\n");
    printf ("Необходимо ввести начало и конец отрезка [a,b] для дальнейшего решения уравнения: \n");
    scanf ("%f %f",&a,&b);
    printf("\n");
    while (a>b) {
        printf ("Ошибка ! Начало отрезка (a) не может быть больше его конца (b). Повторите ввод.\n");
        printf ("Введите начало и конец отрезка [a,b]: \n");
        scanf ("%f %f",&a,&b);
        printf("\n");
    }
    printf("Выберите способ решения:\n1 - Метод половинного деления, 2 - Метод хорд.\n");
    scanf("%d", &s);
    printf("\n");
    if (s==1) {
        while (fabs(b-a)>eps) {
            c=(b+a)/2;
            if (f(c)*f(b)<0) a=c;
            else b=c;
        }
        printf("Ответ: %.10f\n",c);
    }
    else if (s == 2) {
        while (fabs(x - b)>eps) {
            k=x;
            x = b - f(b) * (a - b) / (f(a) - f(b));
            a=b;
            b=k;
        }
        printf("Ответ: %.10f",x);
    }
    return 0;
}
Добавлено через 5 часов 3 минуты
upward
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2018, 01:05
Ответы с готовыми решениями:

Поиск корня уравнения методом деления пополам
#include &lt;stdio.h&gt; #include &lt;math.h&gt; int popolam(double a,double b,double *c,double...

Решение уравнения методом половинного деления отрезка
решить уравнение x^2-7x+8=0 на отрезке я не понимаю почему у меня получается точный ответ...

Найти корень уравнения методом половинного деления
В программе методом половинного деления необходимо найти корень уравнения. Загвоздка в том что при...

Рекурсивная функция root: нахождение корня уравнения методом деления отрезка пополам
Помогите пожалуйста описать рекурсивную функцию root(f,a,b,eps), которая методом деления отрезка...

3
Нарушитель
4144 / 1698 / 242
Регистрация: 01.05.2013
Сообщений: 7,452
16.12.2018, 13:45  [ТС] 2
Вверх.
0
Нарушитель
4144 / 1698 / 242
Регистрация: 01.05.2013
Сообщений: 7,452
17.12.2018, 22:45  [ТС] 3
x2.
0
Нарушитель
4144 / 1698 / 242
Регистрация: 01.05.2013
Сообщений: 7,452
18.12.2018, 23:32  [ТС] 4
Избавился от желания запихнуть 2 этих метода в одну программу и разделил их + добавил защиту от дурака.
Теперь метод половинного деления выглядит следующим образом:
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#include <string.h>
#define eps 1.0e-4
 
double f(float x) {
    return cos(1.05*x)/sin(1.05*x)-x*x;
}
 
/*Функция ввода данных*/
float InputData() {
    int i,f1=0;
    char s[10]; // Строка для принятия введённых пользователем данных
    while (1) /*Бесконечный цикл*/ {
        gets(s);
        for (i=0; i<strlen(s); i++) {
            if (s[i]>=48 && s[i]<=57) continue; // Введена цифра от 0 до 9
            if (s[i]==',' && !f1) {f1=1;continue;} // Введена запятая (впервые)
            if (s[i]=='.' && !f1) {s[i]=','; f1=1; continue;} // Введена точка (впервые)
            if (s[i]=='-' && i==0) continue;
            break; // Введён недопустимый символ
        }
        if (i==strlen(s)) break; // Пользователь ввёл число
        printf ("\nВведено недопустимое значение. Повторный ввод: ");
        f1=0; // Сброс флажка
    }
    return strtof(s,NULL); //Возврат функцией числа типа float
}
 
int main() {
    float a,b,c;
    setlocale(LC_ALL,"Rus");
    printf ("Дано уравнение ctg(1,05x)-x*x.");
    printf ("\n-------------------------\n");
    printf ("Область поиска корня уравнения.\n");
    Retry:
    printf ("Введите начало отрезка: ");
    a=InputData();
    printf ("\nВведите конец отрезка: ");
    b=InputDataF();
    printf("\n");
    while (a>=b) {
        printf ("Отрезок задан не верно! Повтор:\n");
        goto Retry;
    }
    while (fabs(b-a)>eps) {
        c=(b+a)/2;
        if (f(c)*f(b)<0) a=c;
        else b=c;
    }
    printf("Корень уравнения (x): %.4f\n",c);
    system ("PAUSE");
    return 0;
}
Добавлено через 6 минут
Но проблемы с методом хорд всё ещё имеются. Теперь программа для него выглядит так:
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#include <string.h>
 
double f(float x) {
    return cos(1.05*x)/sin(1.05*x)-x*x;
}
 
double poisk_kornya(float a,float b,float eps) {
    double c=0;
    double k;
    do {
        k=c;
        c=b - f(b) * (a - b) / (f(a) - f(b));
        a=b;
        b=k;
    } while (fabs(c-b)>eps);
    return c;
}
 
/*Функция ввода данных*/
float InputData() {
    int i,f1=0;
    char s[10]; // Строка для принятия введённых пользователем данных
    while (1) /*Бесконечный цикл*/ {
        gets(s);
        for (i=0; i<strlen(s); i++) {
            if (s[i]>=48&&s[i]<=57) continue; // Введена цифра от 0 до 9
            if (s[i]==','&&!f1) {f1=1;continue;} // Введена запятая (впервые)
            if (s[i]=='.'&&!f1) {s[i]=','; f1=1; continue;} // Введена точка (впервые)
            if (s[i]=='-'&&i==0) continue;
            break; // Введён недопустимый символ
        }
        if (i==strlen(s)) break; // Пользователь ввёл число
        printf ("\nВведено недопустимое значение. Повторный ввод: ");
        f1=0; // Сброс флажка
    }
    return strtof(s,NULL); //Возврат функцией числа типа float
}
 
int main() {
    float a,b;
    float eps = 0.0001;
    setlocale(LC_ALL,"Rus");
    printf ("Дано уравнение ctg(1,05x)-x*x.");
    printf ("\n-----------------------\n");
    printf ("Необходимо обозначить область [a,b], где будем искать корень.\n");
    Retry:
    printf ("Введите начало отрезка: ");
    a=InputData();
    printf ("\nВведите конец отрезка: ");
    b=InputDataF();
    while (a>=b) {
        printf ("\nОтрезок задан не верно! Повтор:\n");
        goto Retry;
    }
    printf ("\n");
    double x = poisk_kornya(a,b,eps);
    printf("Корень уравнения (x): %lf\n",x);
    system ("PAUSE");
    return 0;
}
Какой отрезок я бы не ввёл, ответ всегда выводится такой -1,#IND00. Как я понял,это означает,что произошёл выход за рамки значения. Но почему ?!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2018, 23:32

Рекурсивная функция root(f, a, b, eps): нахождение корня уравнения методом деления пополам
Описать рекурсивную функцию root(f, a, b, eps), которая методом деления отрезка пополам находит с...

Решение кубического уравнения методом хорд и методом простой итерации
Необходимо написать 2 программы, каждая из которых реализует метод решения уравнения...

Найти корень уравнения методом хорд
2x + \ln(x+1) - 1

Решение нелинейного уравнения методом хорд
Здраствуйте ребят.Огромная прозьба помогите з написанией данной проги.Курсач.Нада до завтра.Ато мне...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru