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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2009, 20:20   #1
jewels
 
Регистрация: 15.11.2009
Сообщений: 4
Смущение поиск корня методом деления пополам

Помогите, пожалуйста, решить задачку: "Пусть f(x) - непрерывная функция, монотонная на отрезке [a,b]. Используя сигнатуру

double dichotomy(double (*f)(double), double a, double b, double eps);

запрограммировать вычисления корня уравнения f(x)=0 на отрезке [a,b] методом деления отрезка пополам при условии, что f(x) принимает на концах отрезка значения разных знаков. Использовать запрограммированную функцию для решения уравнения sin(x) = 0, [π-1, π];


У меня идейки есть, но я не совсем понимаю, что такое double (*f)(double) и как с ним раьотать... я для начала написала прогу:

Код:
#include <iostream>
#include <cmath>
#include <conio.h>
#include "functions.h"
using namespace std;


double dichotomy(double (*f)(double), double a, double b, double eps)
{
	double c;
	c=(b+a)/2;
	while (abs(f(c))<eps){
		if (f(a)*f(c)<0){
			c=(c+a)/2;
		}
		else{
			c=(c+b)/2;
		}
	}
	return f(c);	
}



int main(void)
{
	double pi=3.14;
	double a=pi-1;
	double b=pi;
	double eps=0.000000000000000001;
	double (*f)(double)=sin(double);
	cout<<dichotomy(sin(),a,b,eps)<<endl;
	getch();
}
Посмотрите, посмейтесь и скажите, как правильно её преобразовать))) Пожалуйста!!!!!
jewels вне форума Ответить с цитированием
Старый 15.11.2009, 23:39   #2
pinch000
Пользователь
 
Регистрация: 29.10.2009
Сообщений: 42
По умолчанию

Код:
#include "stdafx.h" 
#include "math.h"

float func(float x) 
{
 return sin(x);
}

int _tmain(int argc, _TCHAR* argv[])
{
 float a,b,c;
 float const e=0.0001;
	printf("Vvedite konci otrezka\n");
  
	do{
	fflush(stdin);
	printf("Vvedite a (tolko chisla!):\n");
      }while(scanf("%f",&a)!=1);
 
	do{

      fflush(stdin);
      printf("Vvedite b (tolko chisla!):\n");
      }while (scanf("%f",&b)!=1);

	c=(a+b)/2;
      printf("c=%g\n",c);
	while((fabs(b-a)>e)&&(func(c)!=0))
      {
      if (func(a)*func(c)<0)
      b=c;
      else
      a=c;
      c=(a+b)/2;
      printf("c=%g\n",c);
	}
      printf("c ravno %g\n",c);
 return 0;


}
pinch000 вне форума Ответить с цитированием
Старый 16.11.2009, 01:09   #3
jewels
 
Регистрация: 15.11.2009
Сообщений: 4
По умолчанию

Огромное спасибо
Но у меня проблема в другом: нужно использовать 100% функцию с 4-мя параметрами
Цитата:
double dichotomy(double (*f)(double), double a, double b, double eps)
и прога расчитана не только на синус, а и на косинус, логарифм, експоненту......
jewels вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Численные методы. Решение нелинейного уравнения методом половинного деления. gree Помощь студентам 1 11.11.2009 18:36
Поиск текста методом последовательного перебора Des Общие вопросы Delphi 5 30.04.2009 16:15
Решение уравнения методом деления отрезка пополам. Методом секущей. Panda196 Паскаль, Turbo Pascal, PascalABC.NET 3 25.11.2008 09:06
Вычисление корня уравнения методом деления отрезка пополам Absent Помощь студентам 12 25.11.2007 17:54