Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

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

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


Вот начало кода:
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, 10:47   #4
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

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

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

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

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

Цитата:
Рекурсию можно получить через циклы 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 в 00:25.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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