Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 07.04.2014, 22:13   #1 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Question Решение нелинейного уравнения методом деления отрезка пополам

Здравствуйте.
Прошу у вас помощи в написании такой вот программы....
И можете примерно описать как такие программы пишутся, вообще тьма.

ФУНКЦИЯ – КАК ПАРАМЕТР ПРОЦЕДУРЫ EQROOT.
Составить программу для решения уравнения f1(х) = 0 и f2(х) = 0 на отрезке [А,В] с точностью Еps методом деления отрезка пополам.
Задача заключается в том, чтобы вычисление индивидуальной формулы F(x) было оформлено в виде функции. При этом сама функция должна быть использована как параметр процедуры EqRoot. Обращение вида F(x) внутри процедуры должно выдать результат вычисления формулы в точке x, подобно тому, как обычно используются стандартные функции типа sin(x), Ln(x). Процедура не должна использовать «внутри себя» глобальных переменных.

Для проверки программы задать:
А = 0 0, В = 2,
массив Еps[1..5]=(0.1,0.01,0.001, 0.0001, 0.00001),
F_16 и F_17

Задача на картинке.

Совершенно не понятно что такое EqRoot...
Возможно это и не трудно, но я даже не знаю с чего начать.
Прошу прощения за свою глупость
Миниатюры
screenshot-68-1-.jpg  
Madara вне форума   Ответить с цитированием

Старый 07.04.2014, 22:13
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Хорошо было бы прочесть похожие обсуждения

Решение дифференциального уравнения
Решение уравнений методом Ньютона

Старый 07.04.2014, 22:19   #2 (permalink)
Gruvi
VIP user
 
Аватар для Gruvi
 
Регистрация: 10.03.2011
Сообщений: 765
Записей в дневнике: 1
Сказал(а) спасибо: 10
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 3453
По умолчанию

Ну если я правильно понял, то
EQ - это корень, root - сама функция ...
Gruvi вне форума   Ответить с цитированием
Старый 07.04.2014, 22:32   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

И почему мне всё чаще хочется взять составителей методичек за волосья и лупить лбом обо что-нибудь твёрдое до появления первой трещины?.. Это ж надо простой вопрос изложить столь напыщенно-высокопарно, что и впрямь ничего не понять!
Вообще-то нужно вот что:
1. Задать функцию отдельно в виде подпрограммы-функции.
2. Написать процедуру, которая будет решать задачу для данного Eps[i] и выдавать результат, при этом, естественно, обращаясь к функции. И обозвать эту процедуру, если уж им так хочется, EQRoot.
3. Тело программы это, по сути, будет цикл по Eps, то есть для каждого из членов массива Eps Вы вызываете процедуру EQRoot, и результатом будет значение корня с возрастающей точностью.
Vladimir_S вне форума   Ответить с цитированием
Старый 07.04.2014, 22:57   #4 (permalink)
Gruvi
VIP user
 
Аватар для Gruvi
 
Регистрация: 10.03.2011
Сообщений: 765
Записей в дневнике: 1
Сказал(а) спасибо: 10
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 3453
По умолчанию

Ну методички в универах всегда страдали "логичной последовательностью составления"
Gruvi вне форума   Ответить с цитированием
Старый 08.04.2014, 09:40   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Gruvi Посмотреть сообщение
Ну методички в универах всегда страдали "логичной последовательностью составления"
Название: offtopic.gif
Просмотров: 852

Размер: 925 байт Часто ловлю себя на мысли - какое счастье, что меня никто программированию не учил и, соответственно, не стоял над душой с дебильными указулями типа "использовать/не использовать то-то", "задать в виде того-то", "описать так-то" и т.д. и т.п. и проч.! Потому что самое IMHO интересное в программировании - это именно творческое начало, ибо почти каждая программа - индивидуальна, каждый, даже начинающий, программист находит свои способы решения, стиль, приёмы - и это ужасно здорово. Увы, иногда возникает ощущение, что горе-преподаватели, в особенности составители методичек, просто задались целью выхолостить творческие подходы и привить студентам прямо таки ненависть к программированию. Извините - иногда трудно сдержаться.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 08.04.2014, 11:22   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Madara Посмотреть сообщение
И можете примерно описать как такие программы пишутся, вообще тьма.
В принципе - методом изучения программирования, чтения всяких книжек и пособий, а главное - проб и ошибок. В конце концов должно получиться что-то в таком роде:
Код:
Var
 Eps:Array[1..5] of Real;
 i:Integer;
 Res:Real;

Function F(x:real):real;
begin
 F:=Sqr(Sin(x)+Cos(x))/Exp(Ln(33.5)*2/3)+Sqrt(3/7)-x;
end;

Procedure EQRoot(e:real; var R:Real);
var
 a,b,c:real;
begin
 a:=0.0;
 b:=2.0;
 Repeat
  c:=(a+b)/2;
  if F(a)*F(c)<0 then b:=c else a:=c;
 Until b-a<e;
 R:=c;
end;

Begin
 Eps[1]:=0.1;
 for i:=2 to 5 do Eps[i]:=Eps[i-1]/10;
 for i:=1 to 5 do
  begin
   EQRoot(Eps[i],Res);
   Writeln(Res:12:10);
  end;
 Readln
End.
Vladimir_S вне форума   Ответить с цитированием
Старый 10.04.2014, 23:30   #7 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо большое.
Не понятно вообще было что требуется, я начал писать вообще по другому и запутался весь.
Madara вне форума   Ответить с цитированием
Старый 13.04.2014, 15:53   #8 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Может кому нибудь пригодится

Оказывается нужно было делать для 2 функций, с выводом количества интераций, с выводом функции от определённого аргумента, у меня F(0.83)...

Переписывал программу на паре в Делфи, не знаю правильно или нет, но препод принял, обозначив ошибку:
PHP код:
a:=0.8;
b:=1.5
"Эти переменные необходимо вводить вне процедуры"


PHP код:
type
TF1
=function(r:real):real;

Function 
F1(x:real):real;
begin
 F1
:=Sqr(Sin(x)+Cos(x))/Exp(Ln(33.5)*2/3)+Sqrt(3/7)-x;
end;
Function 
F2(x:real):real;
begin
 F2
:=Sqrt(ln(7.9)+(exp(-x))-((ln(x)*2)/11))-x;
end;

Procedure EQRoot(e:real; var R:Real; var Idx:integerf:TF1);
var
a,b,c:real;
begin
a
:=0.8;
b:=1.5;
idx:=0;
Repeat
c
:=(a+b)/2;
if 
F(a)*F(c)<0 then b:=c
else a:=cidx:=idx+1;
Until b-a<e;
R:=c;
end;

Var
idx1,idx2:integer;
Eps:Array[1..5of Real;
i:Integer;
Res:Real;
Begin
Eps
[1]:=0.1;
for 
i:=2 to 5 do Eps[i]:=Eps[i-1]/10;
for 
i:=1 to 5 do
begin
EQRoot
(Eps[i],Residx1,f1);
Writeln('tochnost =',eps[i]);
Writeln(' f1=',Res:0:i);
writeln('interacii 1 =',idx1);
EQRoot(Eps[i],Residx2,f2);
Writeln(' f2=',Res:0:i);
writeln('interacii 2 =',idx2);
Writeln;
end;

writeln(F1(0.83):0:4);
Readln;
End
Ещё раз большое спасибо!)
Madara вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


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

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




Часовой пояс GMT +4, время: 21:13.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.