Аватар для Andy_Frol
0 / 0 / 0
Регистрация: 20.03.2012
Сообщений: 10

Нахождение корня уравнения методом дихотомии

20.03.2012, 19:51. Показов 4388. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа должна находить корень уравнения методом дихотомии. Изменяя параметр w, мы должны получить разные корни уравнения, и построить зависимость. Программа работает на простых функциях, но почему-то не работает с нужной мне функцией. Корень функции на искомом интервале [1;10] присутствует, и ≈ 5, но я всегда получаю значение ≈ 0, и это при том, что искомый интервал [1;10].
Функция f=tanh(kl*sqrt(x*x+eps))-eps*sqrt(x*x-1)/sqrt(x*x+eps)
Текст программы

Fortran
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
program lab4
 implicit none
 real(8)::kl,eps,w,w2,p,f,e,p1,p2
 integer i
 e=0.00001
 kl=1
 w=0.1
 p1=1
 p2=10
 do i=1,13
  w2=1/w
  eps=1-w2*w2
  eps=abs(eps)
  call dcht(p1,p2,e,p)
  write(*,*)w,p  
  w=w+0.05
 enddo
end
 
 
function f(x,kl,eps)
 implicit none
 real(8)::x,kl,eps,f                
 f=tanh(kl*sqrt(x*x+eps))-eps*sqrt(x*x-1)/sqrt(x*x+eps)
 return
end
 
subroutine dcht(a,b,e,x)
 implicit none
 real(8)::a,b,e,x,f,kl,eps,c
 c=0 
 do while (abs(f(a,kl,eps))>e)
  x=a+(b-a)/2.
  if(f(x,kl,eps)*f(a,kl,eps)>0)then     
   a=x                   
  else
   b=x
  endif
 c=c+1
 enddo
 return
end


Добавлено через 1 час 45 минут
Фортран-90, компилятор gfortran.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.03.2012, 19:51
Ответы с готовыми решениями:

Методом деления отрезка пополам найти приближённое значение корня уравнения
Здравствуйте Дано действительно положительное число Е. Методом деления отрезка пополам найти приближённое значение корня уравнения...

Нахождение корня уравнения методами дихотомии и итерации
Решить уравнение sin(x+p/3) - 0,5x = 0 на отрезке с точностью e методами дихотомии и итерации. Лаборотная работа 1 Численное решение...

Программно реализовать нахождение корней уравнения методом дихотомии
Доброе время суток. Нужно программно реализовать нахождение корней уравнения методом дихотомии. С методом всё понятно. НО что делать если...

4
 Аватар для BakinEugene
35 / 35 / 0
Регистрация: 26.09.2011
Сообщений: 143
21.03.2012, 10:28
1)Как значения переменных "eps" и "kl" попадут из основной процедуры в "dcht"?
2)Откуда такая уверенность, что корень = 5? У меня получается для забитой вами функции:
Code
1
 x = 1.0050892233848572     f(x) =  2.19520028874107924E-007
Может быть ошибка в функции f(x,kl,eps)?
1
 Аватар для Andy_Frol
0 / 0 / 0
Регистрация: 20.03.2012
Сообщений: 10
21.03.2012, 13:36  [ТС]
1) Подпрограмма "dcht" обращается к функции f(x,kl,eps), а в функцию эти значения переданы.
2) Функция f=tanh(kl*sqrt(x*x+eps))-eps*sqrt(x*x-1)/sqrt(x*x+eps)=0
Я построил график функции

видно, что функция равна нулю в точке ≈5.
0
294 / 206 / 2
Регистрация: 20.02.2011
Сообщений: 551
21.03.2012, 16:49
Странно строили! Я поковырялся в Ёкселе (поэтому пардон за дубовый график), он сказал следующее: при w 0.1 - 0.25 (самые нижние кривые на графике, но первые 4 по списку) все сваливается в отрицательную область, пересекая ноль в районе ~1.2 - 1.5. Следующее значение параметра w (0.3) "задирает хвост" функции в области более высоких х, и где-то около 9 появляется второй корень. 0.35, 0.4 - хвост продолжает задираться, опять два корня. Начиная с w = 0.45 функция корней не имеет...

Возможно, Вы строили график для некоторого значения параметра kl, отличающегося от единицы (как жестко забито в программе)?

ЗЫ: И в любом случае надо было предусмотреть корректную обработку случая, когда нет корней, т.е. знак функции одинаков на концах промежутка.
Миниатюры
Нахождение корня уравнения методом дихотомии  
1
 Аватар для Andy_Frol
0 / 0 / 0
Регистрация: 20.03.2012
Сообщений: 10
22.03.2012, 16:58  [ТС]
Все, разобрался в чем были ошибки: функцию f я определял как переменную а не как функцию; я не передавал значения eps, kl в подпрограмму dcht, а следовательно и в функцию f; в основной программе значения начала и конца отрезка (p1 и p2) нужно было задавать в цикле, так как корень уравнения мы начинаем искать заново на том же интервале; подправил условие в подпрограмме дихотомии.
Исправленная программа:
Fortran
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
program lab4
 implicit none
 real(8)::kl,eps,w,w2,p,f,e,p1,p2
 external f
 integer i
 e=0.00001
 kl=1
 w=0.1
 do i=1,13
  w2=1/w
  eps=1-w2*w2
  eps=abs(eps)
  p1=1
  p2=10
  call dcht(p1,p2,e,p,f,eps,kl)
  write(*,*)w,p  
  w=w+0.05
 enddo
 
end
 
 
function f(x,kl,eps)
 implicit none
 real(8)::x,kl,eps,f                
 f=tanh(kl*sqrt(x*x+eps))-eps*sqrt(x*x-1)/sqrt(x*x+eps)
 return
end
 
subroutine dcht(a,b,e,x,func,eps,kl)
 implicit none
 real(8)::a,b,e,x,func,kl,eps,hhh
 external func
 do while (abs(func(a,kl,eps)-func(b,kl,eps))>=e)
  x=a+(b-a)/2
  if(func(x,kl,eps)*func(a,kl,eps)>0)then     
   a=x                   
  else
   b=x
  endif
 enddo
 return
end
График, который я приводил в предыдущем сообщении, правильный, это для w=0.7, и действительно, корень уравнения равен p=5.0457.
В итоге, получились значения:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
 w=  0.10000000149011612      p=   1.0050891563296318     
 w=  0.15000000223517418      p=   1.0117114633321762     
 w=  0.20000000298023224      p=   1.0215040743350983     
 w=  0.25000000372529030      p=   1.0350527167320251     
 w=  0.30000000447034836      p=   1.0531908869743347     
 w=  0.35000000521540642      p=   1.0771263837814331     
 w=  0.40000000596046448      p=   1.1087667942047119     
 w=  0.45000000670552254      p=   1.1514675617218018     
 w=  0.50000000745058060      p=   1.2117486000061035     
 w=  0.55000000819563866      p=   1.3040165901184082     
 w=  0.60000000894069672      p=   1.4672365188598633     
 w=  0.65000000968575478      p=   1.8594913482666016     
 w=  0.70000001043081284      p=   5.0457153320312500
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.03.2012, 16:58
Помогаю со студенческими работами здесь

Как реализовать нахождение корня уравнения методом секущей и методом хорд
никак не могу понять эти методы

Программно реализовать нахождение корней уравнения методом дихотомии с простейшим графическим интерфейсом
вот консольный исходник на С++ Какую среду выбрать и тип java se/me/gui приложения #include <iostream> #include <math.h>...

Нахождение корня уравнения методом хорд
Описать функционал (horda f a b eps), который методом хорд находит корень Xk,уравнения F(x)=0 на отрезке осуществования корня с точностью...

Нахождение корня уравнения методом хорд
y=x^2-4

Нахождение корня уравнения методом казательных
Реализация метода касательных. При ручном решении и во всяких калькуляторах дает ответ -10,261 за 4 итерации. Тут делает 7 и ответ не тот (...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

Новые блоги и статьи
Деплой Flask приложения
py-thonny 23.06.2025
За годы работы с Flask я натыкался на одни и те же грабли достаточно часто, чтобы наконец научится их обходить. И сегодня хочу поделится опытом, который сбережет вам немало нервных клеток. Начнем с. . .
WebAssembly и контейнеры в .NET Aspire для оркестрации распределенных архитектур
ArchitectMsa 23.06.2025
Я наблюдаю, как WebAssembly (или просто WASM) постепенно выходит за рамки своего первоначального предназначения — исполнения кода на стороне браузера. Теперь эта технология проникает в серверную. . .
Непрерывная интеграция для пакета Python
Mr. Docker 22.06.2025
Было 4 часа утра пятницы, когда я выпустил новую версию нашей внутренней библиотеки для обработки данных. Релиз 0. 5. 2 содержал небольшой фикс для обработки дат в ISO формате, что может пойти не так?. . .
Продвинутый ETL на C# из OLTP БД в хранилище
stackOverflow 22.06.2025
Работая в сфере корпоративной аналитики, я постоянно сталкиваюсь с одним и тем же - нужны чистые, структурированные и, главное, свежие данные. Без них современные аналитические системы, машинное. . .
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru