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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2014, 09:09   #1
Nikolay625
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 26
По умолчанию помогите разобраться(Си)

Вот есть программа для нахождения комплексных корней алгебраического уравнения методом Ньютона-Рафсона. Как тут реализовано нахождение производной?
Код:
#include <stdio.h>
#include <math.h>
#include <complex.h>
typedef float complex	Float;
void Newton_Raphson(int n, Float q[n + 1], Float p[n], float eps);
Float hor(int n, Float a[n + 1], Float x, Float* b)
{
	int i;
	Float val = a[n];
	if (b) {
		b[n - 1] = val;
	}

	for (i = n - 1; i >= 0; --i) {
		val *= x;
		val += a[i];
		if (b && i) {
			b[i - 1] = val;
		}
	}
	return val;
}
Float dhor(int n, Float a[n + 1], Float x)
{
	int i;
	Float val = n * a[n];
	for (i = n - 1; i > 0; --i) {
		val *= x;
		val += i * a[i];
	}
	return val;
}
void newton(int n, Float a[n + 1], Float* px, Float x0, float eps)
{
	Float x = x0, dx, f_val, df_val;
	int niter = 1;
	do {
		f_val = hor(n, a, x, NULL);
		df_val = dhor(n, a, x);
		if (df_val != 0) {
			dx = f_val / df_val;
		} else {
			break;
		}
		x -= dx;
	} while (++niter <= 100 && cabsf(dx) > eps);
	*px = x;
}
void Newton_Raphson(int n, Float q[n + 1], Float p[n], float eps)
{
	Float x, x0;
	int i;
	float err;

	while (n) {
		x0 = 1.0f;
		newton(n, q, &x, x0, eps);
		err = cabsf(hor(n, q, x, NULL));
		if (err > eps) {
			newton(n, q, &x, x0 * I, eps);
			err = cabsf(hor(n, q, x, NULL));
		}
		Float b[n];
		hor(n, q, x, b);
		p[n - 1] = x;
		for (i = 0; i < n; ++i) {
			q[i] = b[i];
		}
		--n;
	}
}
int main(int argc, char* argv[])
{
	int n;
	int i;
	printf("\nstepen uravnenia n=");
	scanf("%d", &n);
	Float q[n + 1];
	Float p[n];
	printf("\nvektor koefficientov:\n");
	for (i = 0; i <= n; i++) {
		float x;
		scanf("%f", &x);
		q[i] = x;
	}
	Newton_Raphson(n, q, p, 1e-6);
	printf("\nKorni uravnenija");
	printf("\nDeystv\t        Mnim\n");
	for (i = 0; i < n; i++) {
		printf("%g\t%10g\n", crealf(p[i]), cimagf(p[i]));
	}
	printf("\n");
	getch ();
	return 0;
}

Последний раз редактировалось Stilet; 16.06.2014 в 09:35.
Nikolay625 вне форума Ответить с цитированием
Старый 16.06.2014, 09:40   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Почему-то у меня складывается вчепятление что нет тут никакой функции, и производная тут не вычисляется. Просто вводятся уже посчитанные на калькуляторе иксы и все.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.06.2014, 10:04   #3
Nikolay625
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 26
По умолчанию

а за функции hor и dhor?
Nikolay625 вне форума Ответить с цитированием
Старый 16.06.2014, 11:11   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Х.з... Метод хорд что ли...
Это надо у автора сего творения спрашивать )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.06.2014, 11:22   #5
Nikolay625
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 26
По умолчанию

а метод Хорнера вам ни о чем не говорит? пытался гуглить, но чет никак
Nikolay625 вне форума Ответить с цитированием
Старый 16.06.2014, 11:30   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Неа. Ни о чем )
Я не математик.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.06.2014, 16:52   #7
Nikolay625
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 26
По умолчанию

5 автоматом гайс)))
Nikolay625 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться der90 PHP 2 19.02.2014 00:46
Помогите разобраться! Дима я Общие вопросы C/C++ 2 21.12.2009 18:31
помогите разобраться!!!!! Даринка Microsoft Office Excel 1 25.04.2009 00:19
Помогите разобраться в С++ saleens7 Общие вопросы C/C++ 5 09.01.2009 17:08
Помогите разобраться Юля6ка Паскаль, Turbo Pascal, PascalABC.NET 5 01.10.2008 22:39