| 
| 
 | Вопрос # 5 714/ вопрос решён / | 
 |  Приветствую, уважаемые эксперты!Передо мной стоит задача подсчета частных производных  от шести функций по шести переменным. Итого 36 раз я должен вызвать процедуру. Напрашивается решение: запихнуть в некий массив ссылки на заданные ф-ии y1,y2,y3,y4,y5 и y6 и затем в цикле перебирать эти ф-ии и переменные по номерам. Вот что получилось, но скорее всего здесь ошибка. Пример для 3-х мерного в-ра:
 
 Заранее спасибо
 Приложение:Переключить в обычный режим unit NutonUnit; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, math, StdCtrls; type   vec3  = array [1..3] of real;   mat33 = array [1..3,1..3] of real;    TForm1 = class(TForm)    Button1: TButton;    Edit1: TEdit;      function y2(M:vec3):real;    function y3(M:vec3):real;    private    { Private declarations }  public      { Public declarations }  end; var  Form1: TForm1; implementation {$R *.dfm}TypeFunc = function(M:vec3):real; function TForm1.y1(M:vec3):real;beginresult:=M[1]*M[1];end; function TForm1.y2(M:vec3):real;beginresult:=M[2]*M[2];end; function TForm1.y3(M:vec3):real;beginresult:=M[3]*M[3];end;  typevecF = array[1..3] of Func;    F[1]:=y1;F[2]:=y2;F[3]:=y3;  function TForm1.proizv(M:vec3):mat33;var f_start,f_finish:real;    i,j:integer;    e,d:real;    M1:vec3;matr_proizv:mat33; begin   e:=0.0001;   d:=0.01;   for i:=1 to 3 do    begin       for j:=1 to 3 do        begin          M1:=M;          f_finish:=100;          repeat             f_start:=f_finish;            M1[j]:=M[j]+d;            f_finish:=(F[i](M1)-F[i](M)/d;             d:=d/2;           until (abs(f_start-f_finish)<e);           matr_proizv[i,j]:= f_finish;         end;    end; end; end. 
|  |   Вопрос задал: porchet (статус: Посетитель)Вопрос отправлен: 3 ноября 2011, 23:12
 Состояние вопроса: решён, ответов: 1.
 |  Ответ #1. Отвечает эксперт: min@y™ Ну, в первом приближении, как-то так (найди 100500 отличий):
 unit NutonUnit;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, math, StdCtrls;
 
type
  // советую, всё же, имена типов начинать с буквы "Т".
  vec3  = array [1..3] of real;
  mat33 = array [1..3,1..3] of real;
  vecF = array[1..3] of Func;
  Func = function(M:vec3):real of object; // <--- для методов класса обязательно of object
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
 
    function y1(M:vec3):real; //ф-ия считает значение в точке (x,y,z) x=M[1] y=M[2] z=M[3]
    function y2(M:vec3):real;
    function y3(M:vec3):real;
    function proizv(M:vec3):mat33;// ф-ия взятия производной
  private
    F:vecF;    // вектор ссылок на ф-ии
  public
    M:vec3;//точка(x,y,z), в которой ищутся частные производные
    constructor Create(AOwner: TComponent); override;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function TForm1.y1(M:vec3):real;
begin
  result:=M[1]*M[1];
end;
 
function TForm1.y2(M:vec3):real;
begin
  result:=M[2]*M[2];
end;
 
function TForm1.y3(M:vec3):real;
begin
  result:=M[3]*M[3];
end;
 
constructor TForm1.Create(AOwner: TComponent);
begin
  inherited;
  F[1]:=y1;
  F[2]:=y2;
  F[3]:=y3;
end;
 
function TForm1.proizv(M:vec3):mat33;
var f_start,f_finish:real;
    i,j:integer;
    e,d:real;
    M1:vec3;
matr_proizv:mat33;
 
begin
 
  e:=0.0001;
 
  d:=0.01;
 
  for i:=1 to 3 do
    begin
 
      for j:=1 to 3 do
        begin
          M1:=M;
          f_finish:=100;
          repeat
 
            f_start:=f_finish;
            M1[j]:=M[j]+d;
            f_finish:=(F[i](M1)-F[i](M)/d;
 
            d:=d/2;
 
          until (abs(f_start-f_finish)<e);
 
          matr_proizv[i,j]:= f_finish;
 
        end;
    end;
 
end;
 
end.АХТУНГ! Код не отлаживал, писал на коленке!
 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 4 ноября 2011, 09:33
 
 |  
 Мини-форум вопросаВсего сообщений: 2; последнее сообщение — 4 ноября 2011, 18:12; участников в обсуждении: 2. 4 ноября 2011, 17:20: Статус вопроса изменён на решённый (изменил автор вопроса — porchet): получил замечательный ответ. Большое спасибо эксперту min@y™. 
|   | porchet (статус: Посетитель), 4 ноября 2011, 17:27 [#1]:Все здорово, спасибо. 
 Я плохо знаком с классами и с почти не имею опыта создания своих собственных типов. Вызвала непонимание вот эта строка
 
 constructor Create(AOwner: TComponent); override;
 .....
 constructor TForm1.Create(AOwner: TComponent);
 begin
 inherited;
 F[1]:=y1;
 F[2]:=y2;
 F[3]:=y3;
 end;
 
 И где можно почитать просто и понятно "на пальцах" про эту тему с простыми примерами?
 |  
|   | min@y™ (статус: Доктор наук), 4 ноября 2011, 18:12 [#2]: Цитата (porchet): Все здорово, спасибо.  А где моё +5?
 
 Цитата (porchet): constructor Create(AOwner: TComponent); override; Это просто переопределение конструктора.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |