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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2015, 00:05   #1
cyx
Пользователь
 
Регистрация: 09.03.2015
Сообщений: 37
По умолчанию Метод половинного деления (степень)

Прошу прощение за неоднократное обращение по этой теме, недавно я столкнулся с такой ошибкой, не могу возвести во степень. Вот как выглядит примерно уравнение(пример): http://savepic.net/6603004.htm в третью степень невозможно возвести. В чём причина и так ли я это всё делаю? просто этой мой курсовой проект и мне нужно так его примерно оформить.
Вот код:
Код:
function F(x:real):real;
begin
F:=k*x*x+d;
end;


function F1(x:real):real;
begin
F1:=k*x*x*x+d;
end;
procedure TForm4.Button2Click(Sender: TObject);
var
//a - левая граница интервала,b - правая граница интервала
// x - корень уравнения,eps - точность,count - счётчик (считает сколько раз происходит вычисление в цикле)
a,b,x,eps:real;
count:integer;
begin
count:=0;
k:=StrToInt(edit4.Text);
d:=StrToInt(edit5.Text);
a:=StrToFloat(Edit1.Text);
b:=StrToFloat(Edit2.Text);
eps:=StrToFloat(Edit3.Text);
repeat
x:=(a+b)/2;
if RadioButton1.checked=true then begin
if f(a)*f(x)>0 then a:=x else b:=x;
inc(count);
end;
if RadioButton2.checked=true then begin
if f1(a)*f1(x)>0 then a:=x else b:=x;
inc(count);
end;
until b-a<eps;
memo1.text:='Функция имеет экстремум - '+FloatToStr(x);
label3.caption:='Количество этапов вычислений - '+IntToStr(count);

Последний раз редактировалось Stilet; 01.04.2015 в 06:43.
cyx вне форума Ответить с цитированием
Старый 01.04.2015, 01:02   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

У меня вопросы.
- откуда функции F и F1 берут значение для переменной k, которая там умножается на квадрат и куб? Она - объявлена как глобальная переменная?
- что именно вы ищете?
Вроде бы сообщение " memo1.text:='Функция имеет экстремум - ", но в самих repeat - поиск решений F(x)=0, и F1(x)=0.
Так что - экстремум или ноль функции?
- зачем так - RadioButton2.checked=true? Можно конечно. Можно даже так
((RadioButton2.checked=true)=true)
- вы знаете, что такое тег code ? Непременно узнайте. Иначе ваш код выглядит, как куча хлама, который даже и разбирать неохота.
type_Oleg вне форума Ответить с цитированием
Старый 01.04.2015, 15:15   #3
cyx
Пользователь
 
Регистрация: 09.03.2015
Сообщений: 37
По умолчанию

d,k объявлены глобально и берут свои значения с edit. Мне нужно сделать возможным выбор степени самостоятельно и коэффициентов. Планировалось так, если, активен radiobutton 1 - то х^2, если radiobutton2, то x^3. Найти надо экстремум. пожалуйста, помогите разобраться, я уже над этой программой долго сижу. сроки поджимают.
cyx вне форума Ответить с цитированием
Старый 01.04.2015, 15:29   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
type TMyFunction = function(x:real):real;
var MyFunction: TMyFunction;

...

  if RadioButton1.checked then MyFunction:=F else MyFunction:=F1; 

  repeat
    x:=(a+b)/2;
    if MyFunction(a)*MyFunction(x)>0 then a:=x else b:=x;
    inc(count);
  until b-a<eps;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.04.2015, 17:59   #5
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Аватар, это да.. но во-первых, процедурные типы - это слишком сложно для нынешних курсовых.
А главное - ему " .. Найти надо экстремум ", а не решение f(x)=0.
Экстремум - это максимум или минимум.
Хотя непонятно, зачем именно такие функции. Ведь у них, независимо от значений k и d экстремум - всегда в точке x = 0 !
Если k>0 - там минимум, если k<0 - максимум.
Так что уточнить надо.
И еще - переменную k (коэффициент при x ) - почему через глобальные переменные? Почему x - через аргументы, а k - через глобальные?
Кстати, и степень ( 2 или 3) тоже лучше через аргументы.
Тогда будет только одна функция
Код:
 function f23(x,k,d:Real;stepen:Byte):Real;
begin
 if stepen=2 then f23:=x*x*k+d else f23:=x*x*x*k+d;
end
И в самом бутонклике -
Код:
var step:2..3;
// ...
begin
 if RadioButton1.checked then step:=2 else step:=3;
 repeat
  f23(x,k,d,step) .... 
// ...
Как искать , и что искать - пишите сами.

Вот, кстати нашел поиск максимума методом половинного деления с примером на Паскале . Там написано " экстремума", но ищется именно максимум.

Последний раз редактировалось type_Oleg; 01.04.2015 в 18:01.
type_Oleg вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод итерация и метод половинного деления Delphi gabach Помощь студентам 1 24.12.2014 07:43
Метод половинного деления qwerty55 Паскаль, Turbo Pascal, PascalABC.NET 2 28.05.2012 16:31
Метод половинного деления serhan Паскаль, Turbo Pascal, PascalABC.NET 10 03.10.2011 22:39
Turbo Pascal[програмыки : текстовая\метод симпсона\метод половинного деления qsccsq Помощь студентам 7 24.12.2010 05:23
Безумно сложные задачки!!!! Метод Гаусса, итераций, метод половинного деления, задача Коши и т.д. Хомяк!!!!! Помощь студентам 4 08.07.2009 10:08