Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
2 / 1 / 0
Регистрация: 17.10.2022
Сообщений: 16

Метод половинного деления с помощью делегатов

27.12.2022, 19:42. Показов 922. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На основе принципа функциональной параметризации создать универсальный метод решения уравнений f(x) = 0, в основе которого заложен численный метод деления отрезка пополам. С помощью делегата задается функция левой части уравнения (применить лямбда-выражение).Вот что я написала, но что-то не выходит
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
using System;
using System.Collections;
 
 
namespace ConsoleApp23
{
    static void Main()
    {
        double e = 0.01;
        Console.WriteLine(bisect(0.0, 4.0, x => Math.Cos(x)));
 
    }
    public delegate double func(double x);;
 
    public static double bisect(double a, double b, Func f)
    {
        double e = 0.01;
        double c;
        do
        {
            if (f(x) * f(x) < 0)
            {
                b = x;
            }
            else
            {
                a = x;
            }
        } while (Math.Abs(a - b) >= e);
 
        return c;
 
    }
}
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.12.2022, 19:42
Ответы с готовыми решениями:

Метод половинного деления и метод простой итерации
Ребят, помогите пожалуйста написать программу на С#, решение нелинейного уравнения. Уравнение: x-10·sinx = 0 - Сделать Отделение корней...

Метод половинного деления на С#
Ребят, помогите пожалуйста написать программу на С#, решение нелинейного уравнения методом половинного деления, найти корень ...

метод половинного деления
Необходим решить уравнение, например х-2, методом половинного деления. Вот код using System; class Bis { static void Main() ...

10
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3423 / 2742 / 575
Регистрация: 04.09.2018
Сообщений: 8,611
Записей в блоге: 3
27.12.2022, 20:08
Цитата Сообщение от АлинаСоколова Посмотреть сообщение
почему?
Что такое делегат?
0
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
27.12.2022, 20:18
Цитата Сообщение от АлинаСоколова Посмотреть сообщение
if (f(x) * f(x) < 0)
А здесь всегда false.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
28.12.2022, 22:29
Цитата Сообщение от АлинаСоколова Посмотреть сообщение
if (f(x) * f(x) < 0)
Это выражение даёт квадрат функции. А квадрат никогда не бывает меньше нуля.

Добавлено через 2 минуты
Цитата Сообщение от АлинаСоколова Посмотреть сообщение
double e = 0.01;
Зачем в двух разных методах задаёте?
Если это погрешность, то её нужно передавать в параметрах метода bisect.

Добавлено через 5 минут
Цитата Сообщение от АлинаСоколова Посмотреть сообщение
Метод половинного деления
В начале нужно проверять разнознаковость значений функции на границах диапазона.
Если знаки одинаковые, то может не быть сходимости и нужно выкидывать исключение.

Так же в условии нужно проверять функцию и на равенство нулю.
Если такое условие выполнится, то это "досрочное" решение.
А присваивать "середину" нужно границе имеющей тот же знак функции.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3423 / 2742 / 575
Регистрация: 04.09.2018
Сообщений: 8,611
Записей в блоге: 3
28.12.2022, 23:06
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А присваивать "середину" нужно границе имеющей тот же знак функции.
Ммм... ну, от части так, да.
Но самое главное, на что никто не обратил внимания: делегат есть, а его реализации и использования в методе нет. Я начал с этого свой диалог с ТС.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
28.12.2022, 23:36
Цитата Сообщение от wizard41 Посмотреть сообщение
делегат есть, а его реализации и использования в методе нет
???
Он создаётся лямбдой x => Math.Cos(x).
Или вы что-то другое имеете ввиду?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3423 / 2742 / 575
Регистрация: 04.09.2018
Сообщений: 8,611
Записей в блоге: 3
28.12.2022, 23:46
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Или вы что-то другое имеете ввиду?
Цитата Сообщение от АлинаСоколова Посмотреть сообщение
C#
1
public delegate double func(double x);
Я про этот.
1
26 / 14 / 12
Регистрация: 01.02.2019
Сообщений: 66
29.12.2022, 03:08
Цитата Сообщение от wizard41 Посмотреть сообщение
Но самое главное, на что никто не обратил внимания: делегат есть, а его реализации и использования в методе нет. Я начал с этого свой диалог с ТС.
Если чуть-чуть протереть глазоньки, можно заметить и использование
public static double bisect(double a, double b, Func f)
и реализацию
Console.WriteLine(bisect(0.0, 4.0, x => Math.Cos(x)));

АлинаСоколова, вы - молодец, только при объявлении делегата опечатались, написали func с маленькой буквы.
Ещё у вас в методе bisect откуда-то взялся х.
Ввиду того, что я не знаю что это такое "универсальный метод решения уравнений f(x) = 0, в основе которого заложен численный метод деления отрезка пополам" ответить точно я вам не могу. Но если покрутить страницу вниз, там есть похожие темы. К примеру эта метод половинного деления
Это не ответ, но может вам как-то похожим образом следует объявить х
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    float n(float a, float b)
    {
        float x=(a+b)/2;
        while (Math.Abs(f(x))>0.001)
        {
            if (f(x) > 0)
                b = x;
            else
                a = x;
        }
        x = (a+b)/2;    
         return x ;
        Console.WriteLine("Otvet=" + n(0, 100));        
    }
или заменить на вашу "цэ" и всё заработает? Хотя, наверное, уже сами всё решили.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3423 / 2742 / 575
Регистрация: 04.09.2018
Сообщений: 8,611
Записей в блоге: 3
29.12.2022, 04:11
Цитата Сообщение от cyberforu99999m Посмотреть сообщение
опечатались, написали func с маленькой буквы.
а может Func в параметрах метода с большой?
Цитата Сообщение от cyberforu99999m Посмотреть сообщение
Если чуть-чуть протереть глазоньки, можно заметить и использование
ну ну. неужели я этого не заметил?
cyberforu99999m, Func и func две разные вещи, по контексту.
1
26 / 14 / 12
Регистрация: 01.02.2019
Сообщений: 66
29.12.2022, 04:52
Цитата Сообщение от wizard41 Посмотреть сообщение
а может Func в параметрах метода с большой?
Я обратил внимание ТСа на эту мелочь, а он сам решит привести к lowercase, Title Case или чему-то другому.
Цитата Сообщение от wizard41 Посмотреть сообщение
ну ну. неужели я этого не заметил?
Ну-ну, человек пришёл за помощью и отвечать ему
Цитата Сообщение от wizard41 Посмотреть сообщение
Хрень написала.
на даже не опечатку в букве, а непрожатый "шифт".
Цитата Сообщение от wizard41 Посмотреть сообщение
Func и func две разные вещи, по контексту.
Я мог бы поинтересоваться, что же по вашему мнению олицетворяет Func с заглавной буквы в аргументах метода bisect в отрыве от делегата func со строчной, но мне не интересно. Абсолютно "разные вещи, по контексту" же.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
29.12.2022, 09:33
Цитата Сообщение от wizard41 Посмотреть сообщение
Цитата Сообщение от АлинаСоколова Посмотреть сообщение
C#
13
public delegate double func(double x);
Я про этот.
Действительно я не заметил, что регистр другой.


Добавлено через 35 минут
Цитата Сообщение от АлинаСоколова Посмотреть сообщение
Метод половинного деления с помощью делегатов
Накидал "на быструю руку". Не тестировал.
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
namespace Core2022
{
    /// <summary>Объявление делегата функции принимающей один <see cref="double"/>
    /// параметр и возвращающей <see cref="double"/> значение.</summary>
    /// <param name="x">Параметр функции.</param>
    /// <returns>Значение функции для параметра x.</returns>
    public delegate double Func(double x);
 
    public static partial class MyMath
    {
        /// <summary>Поиск корня функции методом половинного деления.</summary>
        /// <param name="a">Граница диапазона поиска.</param>
        /// <param name="b">Граница диапазона поиска.</param>
        /// <param name="func">Функция для которой ищется корень.</param>
        /// <param name="eps">Погрешность значения функции для корня.</param>
        /// <returns>Корень функции.</returns>
        /// <exception cref="ArgumentOutOfRangeException">Если <paramref name="eps"/> отрицательное.</exception>
        /// <exception cref="ArgumentException">Если функция на границах заданного диапазона имеет одинаковый знак.</exception>
        /// <remarks>Корнем функции считается такое значение её параметра
        /// при котором значение функции меньше или равно <paramref name="eps"/>.</remarks>
        public static double HalfDivision(double a, double b, Func func, double eps = 0.0001)
        {
            double fa = func(a);
            double fb = func(b);
            if (eps < 0)
                throw new ArgumentOutOfRangeException(nameof(eps), "Не может быть отрицательным.");
            if (Math.Abs(fa) <= eps)
                return a;
            if (Math.Abs(fb) <= eps)
                return b;
            if (fa * fb > 0)
                throw new ArgumentException("Значения функции на границах диапазона должны быть разного знака");
 
            // Упорядочивание границ диапазона.
            if (fa > 0)
                (a, b) = (b, a);
 
            // Переменные для средней точки.
            double medium, fm;
 
            // Цикл замены одной из границ средней точкой.
            // Выход из цикла, если погрешность значения функции меньше-равно eps.
            do
            {
                medium = 0.5 * (a + b);
                fm = func(medium);
                if (fm < 0)
                    a = medium;
                else
                    b = medium;
            } while (Math.Abs(fm) > eps);
 
            return medium;
        }
    }
}
Добавлено через 6 минут
Тест:
C#
1
2
3
4
5
6
7
8
{
    // Пример вызова с явным созданием делегата и заданием требуемой погрешности.
    Func func = x => Math.Cos(x);
    Console.WriteLine(MyMath.HalfDivision(0.0, 3.0, func, 0.1));
 
    // Пример вызова с созданием делегата лямбдой и погрешностью по умолчанию.
    Console.WriteLine(MyMath.HalfDivision(0.0, 3.0, x => Math.Cos(x)));
}
Консоль1,5
1,57086181640625
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.12.2022, 09:33
Помогаю со студенческими работами здесь

Метод половинного деления
Доброго времени суток. Есть ли программа для отделения корней уравнения вида x^3 - 3x^2+9x-8=0 Метод половинного деления.

Метод половинного деления
Помогите пожалуйста решить уравнение методом половинного деления: 5sin(x)=x^2, x € , с точностью 10^-4.

Метод половинного деления
помогите пожалуйста написать программу для решения уравнения методом половинного деления. уравнение F(x)=0. как описать это уравнение в...

Метод половинного деления
Здравствуйте. Стоит задача - сгенерировать через RND массив, а затем методом половинного деления найти элемент, который вводится с...

Метод половинного деления
Ребят помогите пожалуйста составить программу, чтобы найти все корни уравнения x^3 + 12 = x(3x − 4) using System; ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru