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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2013, 00:38   #1
Razdolbai
Новичок
Джуниор
 
Регистрация: 12.11.2012
Сообщений: 20
Печаль классический метод поиска экстремума функции

Здравствуйте господа, столкнулся с сложной проблемой, требуется написать программу на классический метод поиска экстремума функции, реализуя метод главных элементов( информация на счет данного метода прикреплена фотографией) смог решить данную задачу только методом Крамера, но и тут проверяющие стали возникать что не их метод=(
Помогите бедному студенту пожалуйста, файл с задачей прикреплен,надеюсь мир не без добрых людей
задание.rar

20130721_002056.jpg
Razdolbai вне форума Ответить с цитированием
Старый 21.07.2013, 00:39   #2
Razdolbai
Новичок
Джуниор
 
Регистрация: 12.11.2012
Сообщений: 20
По умолчанию

Вот код методом крамера если пригодится

Код:
uses crt;
const n=4;
type
   Tmatr=array [1..n,1..n] of real;
var a1,a2,a3,a4,a12,a13,a14,a23,a24,a34,a11,a22,a33,a44,x1,x2,x3,x4,d1,d2,d3,d4,d:real;
q:char;
a:Tmatr;
 
    det:real;//определитель
//процедура перестановки строк, чтобы главный элемент не оказался 
//нолем или близким к нулю значением
procedure Per(k,n:integer;var a:Tmatr; var p:integer);
var i,j:integer;z:real;
begin
   z:=a[k,k];i:=k;p:=0; //после каждого преобразования
   for j:=k+1 to n do   //ищем по оставшимся строкам
     begin
       if abs(a[j,k])>z then //максимальный по модулю элемент
          begin
            z:=abs(a[j,k]);i:=j; //запоминаем номер строки
            p:=p+1;//считаем количество перестановок, т.к. при каждой 
                    //перестановке меняется знак определителя
          end;
     end;
   if i>k then  //если эта строка ниже данной
   for j:=k to n do
     begin
       z:=a[i,j];a[i,j]:=a[k,j];a[k,j]:=z;//перестановка
     end;
end;
function znak(p:integer):integer;//ф-я определения знака определителя
begin
if p mod 2=0 then //если четное количество перестановок, "+" , если нет "-"
znak:=1 else znak:=-1;
end;
procedure opr(n:integer;var a:Tmatr;var det:real);//собственно определитель
var k,i,j,p:integer;
    r:real;
begin
det:=1;
for k:=1 to n do  //считаем по алгоритму, который во всех учебниках 
   begin
     if a[k,k]=0 then per(k,n,a,p);//если главный элемент=0, делаем перестановку
     det:=znak(p)*det*a[k,k]; //меняем знак определителя
     for j:=k+1 to n do  //делаем преобразования
       begin
         r:=a[j,k]/a[k,k];
         for i:=k to n do
           begin
             a[j,i]:=a[j,i]-r*a[k,i];
           end;
       end;
   end;
end;
begin
writeln('Хотите ввести a1...a44 вручную?(Y/N)');
q := ReadKey;
if q='Y' then begin
writeln('Введите a1,a2,a3,a4,a12,a13,a14,a23,a24,a34,a11,a22,a33,a44:');
read(a1,a2,a3,a4,a12,a13,a14,a23,a24,a34,a11,a22,a33,a44);
end else begin
a1:=5.1;a2:=3.2;a3:=4.1;a4:=3.6;a12:=2.5;a13:=2.1;a14:=3.7;a23:=7.1;a24:=2.6;a34:=2.3;a11:=2.5;a22:=5.1;a33:=2.8;a44:=2.1;
writeln('Производная по x1: ',2*a11,'*x1+',a12,'*x2+',a13,'*x3+',a14,'*x4+',a1);
writeln('Производная по x2: ',a12,'*x1+',2*a22,'*x2+',a23,'*x3+',a24,'*x4+',a2);
writeln('Производная по x3: ',a13,'*x1+',a23,'*x2+',2*a33,'*x3+',a34,'*x4+',a3);
writeln('Производная по x4: ',a14,'*x1+',a24,'*x2+',a34,'*x3+',2*a44,'*x4+',a4);
a[1,1]:=2*a11; a[1,2]:=a12;   a[1,3]:=a13;   a[1,4]:=a14;
a[2,1]:=a12;   a[2,2]:=2*a22; a[2,3]:=a23;   a[2,4]:=a24;
a[3,1]:=a13;   a[3,2]:=a23;   a[3,3]:=2*a33; a[3,4]:=a34;
a[4,1]:=a14;   a[4,2]:=a24;   a[4,3]:=a34;   a[4,4]:=2*a44;
opr(n,a,det);
d:=det;
writeln('opr=',det:4:0);
if d=0 then
 begin
  writeln('Система не определена');
  readln;
  exit
 end;
a[1,1]:=a1; a[1,2]:=a12;   a[1,3]:=a13;   a[1,4]:=a14;
a[2,1]:=a2;   a[2,2]:=2*a22; a[2,3]:=a23;   a[2,4]:=a24;
a[3,1]:=a3;   a[3,2]:=a23;   a[3,3]:=2*a33; a[3,4]:=a34;
a[4,1]:=a4;   a[4,2]:=a24;   a[4,3]:=a34;   a[4,4]:=2*a44;
opr(n,a,det);
d1:=det;
writeln('opr=',det:4:0);
a[1,1]:=2*a11; a[1,2]:=a1;   a[1,3]:=a13;   a[1,4]:=a14;
a[2,1]:=a12;   a[2,2]:=a2; a[2,3]:=a23;   a[2,4]:=a24;
a[3,1]:=a13;   a[3,2]:=a3;   a[3,3]:=2*a33; a[3,4]:=a34;
a[4,1]:=a14;   a[4,2]:=a4;   a[4,3]:=a34;   a[4,4]:=2*a44;
opr(n,a,det);
d2:=det;
writeln('opr=',det:4:0);
a[1,1]:=2*a11; a[1,2]:=a12;   a[1,3]:=a1;   a[1,4]:=a14;
a[2,1]:=a12;   a[2,2]:=2*a22; a[2,3]:=a2;   a[2,4]:=a24;
a[3,1]:=a13;   a[3,2]:=a23;   a[3,3]:=a3; a[3,4]:=a34;
a[4,1]:=a14;   a[4,2]:=a24;   a[4,3]:=a4;   a[4,4]:=2*a44;
opr(n,a,det);
d3:=det;
writeln('opr=',det:4:0);
a[1,1]:=2*a11; a[1,2]:=a12;   a[1,3]:=a13;   a[1,4]:=a1;
a[2,1]:=a12;   a[2,2]:=2*a22; a[2,3]:=a23;   a[2,4]:=a2;
a[3,1]:=a13;   a[3,2]:=a23;   a[3,3]:=2*a33; a[3,4]:=a3;
a[4,1]:=a14;   a[4,2]:=a24;   a[4,3]:=a34;   a[4,4]:=a4;
opr(n,a,det);
d4:=det;
writeln('opr=',det:4:0);
x1:=-d1/d;
x2:=-d2/d;
x3:=-d3/d;
x4:=-d4/d;
writeln('x1=',x1:0:2,' x2=',x2:0:2,' x3=',x3:0:2,' x4=',x4:0:2);
writeln(d);
readln
end;
end.
Razdolbai вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из консоли на форму (программа нахождения экстремума функции методом наискорейшего спуска) .FROST. C++ Builder 1 17.06.2013 13:18
Симплекс метод, поиск экстремума ayPinki Паскаль, Turbo Pascal, PascalABC.NET 0 20.12.2012 16:20
Поиск экстремума функции методом Фибоначчи naty7773 Помощь студентам 0 19.11.2012 16:15
Нахождение экстремума функции Виктори Помощь студентам 2 08.11.2010 15:53
Нахождение экстремума функции от двух переменных dekameron Помощь студентам 3 26.05.2010 08:16