Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 05.06.2018, 00:25   #1
pirab
Новичок
 
Регистрация: 13.03.2018
Сообщений: 3
Репутация: 10
По умолчанию Решение уравнения f(x)=0 на заданном отрезке

Помогите составить программу, которая определяет решение уравнения f(x)=0 на заданном отрезке (a,b) с точностью E с использованием рекурсивного метода деления отрезка пополам. Вид функции должен осуществляться с использованием компонента ComboBox, содержащего три различных варианта. Предусмотрите, чтобы в качестве входного параметра в используемую подпрограмму передавался вид выбранной из компонента ComboBox функции
pirab вне форума   Ответить с цитированием
Старый 05.06.2018, 00:32   #2
саша40
Профессионал
 
Регистрация: 12.09.2012
Сообщений: 1,026
Репутация: -22
По умолчанию

И куда вы это будете выводить? По факту комбобокса придётся составить три отдельные функции, для каждого варианта уравнения. Метод же переводится в алгоритм и получается массив значений переменной (х) на промежутке. Остается только задать шаг, который задается точностью(обычно это количество знаков после запятой).
__________________
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума   Ответить с цитированием
Старый 05.06.2018, 00:48   #3
pirab
Новичок
 
Регистрация: 13.03.2018
Сообщений: 3
Репутация: 10
По умолчанию

Значение корня буду выводить в эдит
Я придумала несколько функций и вставила в комбобокс. Я буду использовать метод дихотомии
Алгоритм метода я знаю. И как получить рекурсивный цикл с ним.
Проблема заключается в том, как перебрать все эти функции и вставить в метод.....


Вот начало кода:
procedure TForm1.FormCreate(Sender: TObject);
begin
cbb1.Items.Add('sin(x)');
cbb1.Items.Add('x*x-1');
cbb1.Items.Add('x*x+4x+4');
end;

function recurs(eps:real; var a, b:Real):Real;
function F(x:Real):Real;
begin
if Form1.cbb1.ItemIndex=0 then
F:=Sin(x);
if Form1.cbb1.ItemIndex=1 then
F:= x*x-1;
if Form1.cbb1.ItemIndex=2 then
F:=x*x+4*x+4;
end;

var c:Real;
begin
c:=(a+b)/2;
if abs(F(c))<=eps
then recurs:=c

else if F(a)*F(c)<0
then recurs:=recurs(a,c)
else recurs:=recurs(c,b);
end;





pirab вне форума   Ответить с цитированием
Старый 05.06.2018, 11:47   #4
саша40
Профессионал
 
Регистрация: 12.09.2012
Сообщений: 1,026
Репутация: -22
По умолчанию

Рекурсию можно получить через циклы Repeat Until или While Do, или даже For to do для переборки списков. Просто киньте туда функцию и всё. Вот только в окончание первого условия, я ещё записывал бы результат функции. Как я понял из кода идёт постоянное уточнение параметра функции, при котором её точность не будет меньше заданного значения. Никогда не понимал это, по мне лучше количество цифр после запятой - понятней, удобней и при всех инженерных расчётов обычно хватает 3-4 цифр после запятой, а при более сложных хватает и 10 знаков после запятой.
__________________
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума   Ответить с цитированием
Старый 05.06.2018, 11:54   #5
Sciv
Профессионал
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Адрес: Курган
Сообщений: 3,227
Репутация: 1231
По умолчанию

Цитата:
Сообщение от саша40 Посмотреть сообщение
Рекурсию можно получить через циклы Repeat Until или While Do, или даже For to do для переборки списков.
Спасибо, порадовали. Читаем определение термина "рекурсия"
__________________
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv на форуме   Ответить с цитированием
Старый 05.06.2018, 11:57   #6
Sciv
Профессионал
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Адрес: Курган
Сообщений: 3,227
Репутация: 1231
По умолчанию

Цитата:
Сообщение от pirab Посмотреть сообщение
Проблема заключается в том, как перебрать все эти функции и вставить в метод.....
Похожая тема: http://www.programmersforum.ru/showthread.php?t=66524
__________________
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv на форуме   Ответить с цитированием
Старый 05.06.2018, 19:13   #7
саша40
Профессионал
 
Регистрация: 12.09.2012
Сообщений: 1,026
Репутация: -22
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Спасибо, порадовали. Читаем определение термина "рекурсия"
Я и без этого знаю, что такое рекурсия. Но для таких алгоритмов есть и более легкие методы рекурсии с меньшим потреблением памяти. Но здесь можно обработать событие OnSelect и вывести результат в отдельный список. Дальше по тексту отметил частный баг и логический недочет в рекурсии.
Бывает и функция в функции, но это уже к больше алгоритмам из теории рядов.
__________________
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума   Ответить с цитированием
Старый 07.06.2018, 01:21   #8
Человек_Борща
Модератор
Заслуженный модератор
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Адрес: Республика Беларусь, г. Минск
Сообщений: 11,471
Репутация: 2769
По умолчанию

Цитата:
Рекурсию можно получить через циклы Repeat Until или While Do, или даже For to do для переборки списков.
Бггг, с 12-го года так и не научились?

Цитата:
Проблема заключается в том, как перебрать все эти функции и вставить в метод.....
Элементарно Переберите варианты с вызовом функции внутри.
Код:

var
  i, last: Integer;
begin
  last := cbb1.ItemIndex; //Для тактичности, запоминаем последний индект.
  cbb1.Enabled := Fasle; //Блокируем контрол, а то вдруг пользователь успеет испортить всё
  for i:= 0 to cbb1.Items.Count -1 do
  begin
    cbb1.ItemIndex := i; //Выбираем элемент в списке, программно
    {Вызов recurs, внутри которой F отработает согласно текущему состоянию cbb1}
  end;
  cbb1.ItemIndex := last;
 cbb1.Enabled := True;
end;


Последний раз редактировалось Человек_Борща; 07.06.2018 в 01:25.
Человек_Борща вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На заданном отрезке найти все корни уравнения f(x)=0 с точностью ε . Free Pascal avatar54 Помощь студентам 2 05.06.2017 21:48
на заданном отрезке найти все корни уравнения f(x)=0 с точностью e ZigaBr0 Паскаль 4 19.09.2016 13:03
Найти произведение результатов заданной функции на заданном отрезке с шагом. [C++] проверьте, пожалуйста, решение Alexan-Dwer Помощь студентам 4 19.11.2014 14:33
Вычислить значения интеграла на заданном отрезке [a,b] lolwto Помощь студентам 5 31.01.2013 00:35
Найти все целочисленные решения уравнения 3x+4y=2z на заданном отрезке [L,R] Zmey_by_Nojabrsk Помощь студентам 3 18.10.2007 22:08


23:27.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru