|
Вопрос # 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}
- Type
- Func = function(M:vec3):real;
-
- 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;
-
-
- type
- vecF = 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|