Название: Информатика.Алгоритмы и программы вычислительных задач микроэлектроники - Метод.(Н.В. Усольцев)

Жанр: Информатика

Просмотров: 907


3. задание левой части уравнения

Для решения конкретных уравнений необходимо обеспечить многократное вычисление левой части (в методе простых итераций – правой) от текущего значения x. Кроме того, метод Ньютона требует вычисления производных. Для удобства "присоединения" различных уравнений их реализуют в виде подпрограмм (функций), к

Рис. 5.4. Блок-схема алгоритма метода хорд

 

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

                                                         (10)

где  - дифференцирующее приращение аргумента.

Заголовок функции при этом может иметь вид:

double FuncName(double x)

где      FuncName – условный идентификатор функции.

При выполнении итераций значение аргумента может выйти за область определения функции. При этом может произойти аварийный останов (run-time error). Для корректного завершения алгоритма рекомендуется, чтобы в этом случае функция возвращало какое-нибудь определенное значение, например, константы FLT_MAX. Это иллюстрируется следующим примером:

Листинг 1

#include <math.h>                              

#include <float.h>

                              

double f(double x)                             

{

  double z;

 

  z=x*x+x;                                              

  if (z<0.0) return FLT_MAX;                     

 

  return sqrt(z)-exp(x);

}                                

Часто левая часть уравнения содержит ряд параметров, которые задаются или считаются в вызывающем модуле. Их рекомендуется передавать в функцию FuncName() как глобальные переменные с тем, чтобы не изменять список параметров модуля, выполняющего решение. Например, следующим образом:

Листинг 2

#include <math.h>                              

#include <float.h>

 

double a,b;                 // глобальные переменные

 

void main()

{

  a=1.5;    b=-2.2;

// Обращение к функции, выполняющей решение

  Err=RootNewton(f,X0,epsX,epsF,dXmax,limit,KeyDemo, X,Fx,Nckl);

}                             

double f(double x)                             

{

  double z;

 

  z=a*x*x+b*x;                                              

 

  if (z<0.0) return FLT_MAX;                     

  return sqrt(z)-exp(x);

}                                

Естественно, переменные a и b при этом нельзя повторно описывать в main() и в функции f().