2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3, 4
 
 Re: метод половинного деления
Сообщение30.10.2012, 12:06 
cyber_ua в сообщении #637500 писал(а):
сам не понимаю как такую фигню мог написать=)
Тем не менее, Вы упорно продолжаете это делать...

cyber_ua в сообщении #637500 писал(а):
но результат получается какой то сильно маленький
Что есть полученный результат? Курс доллара на МВБ? Цена литра бензина? Корень заданного уравнения? Нет. Вы берёте интервал, по какой-то(?) логике его уменьшаете изменяя границы, интервал стремится к точке, в данном случае — к нулю. Что Вы ещё хотите?

Перечитайте ещё раз приведённую Вами цитату:"возьмем x, равное среднему между a и b..." — в программе это есть, "и вычислим f(x)." — а это где? Что такое $f(x)$? Может это из условия задачи $f(x)=0$?

 
 
 
 Re: метод половинного деления
Сообщение30.10.2012, 12:31 
И снова программа работает абсолютно правильно, как и написано. Результат сильно маленький? Так если бы он таким не был, цикл бы не останавливался. Так что все правильно.

 
 
 
 Re: метод половинного деления
Сообщение30.10.2012, 12:59 
Да ёклмн... ладно, пойдем испытанным способом.

cyber_ua
Во-первых, начните новый проект. Далее, напишите функцию double F(double x) которая будет вычислять вашу $f(x)$ — что у вас там было, я уж не помню.

Потом напишите функцию bool Dichotomy(Func<double, double> func, ref double a, ref double b). На вход она получает функцию вида double (double x), левый конец отрезка a и правый конец отрезка b. Dichotomy должна работать следующим образом: если $f(a)$ — который вычисляется как func(a), кстати — и $f(b)$ одного знака, она должна немедленно возвратить false. Иначе она должна вычислить $x=\frac{a+b}{2}$, $f(x)$ и далее: если $f(a)f(x) < 0$, то b = x, иначе a = x. После этого она должна вернуть true.

Теперь вы пишете функцию bool Solve(Func<double,double> func, double a, double b, double eps, out double result). Она должна вначале определить внутренние переменные double _a = a, _b = b; и в цикле вызывать Dichotomy(func, _a, _b) — пока та возвращает true и Math.Abs(_a - _b) > eps. Если цикл закончится потому что Dichotomy вернула false, вы должны немедленно вернуть false, иначе присвойте result значение (_a + _b) / 2 и верните true.

Теперь напишите Main: ввод с клавиатуры a, b, eps, вызов Solve (bool success = Solve(f, a, b, eps, out result);), вывод результатов.

Нда, даже куски кода написал... все, вперед. К концу пары я начинаю принимать зада- простите, вспомнил свою преподавательницу численных методов :| Не самые приятные воспоминания: у нее был невероятно паршивый характер, но зато она всегда рассказывала, какие функции должны быть в готовой программе, и с какими параметрами.

-- Вт окт 30, 2012 13:59:58 --

Ах да, и вдогонку: текущая версия вашей программы решает уравнение $x=0$. Угадайте, какое у него точное решение.

 
 
 [ Сообщений: 48 ]  На страницу Пред.  1, 2, 3, 4


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group