Помощь - Поиск - Пользователи - Календарь
Полная версия: Программа вычисление золотого сечения
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Casio
Здраствуйте. Помогите решить след. задачу:
Составить программу вычисления золотого сечения q с точностью Е=0.00001, используя представление q в виде:
Программа строится на вычислении предыдущего z1 и нового значения z2. Итерационный
Код

q=1 + ______1_________
      2 + ____1_______
           2 + ___1___
               2 + ...

цикл заканчивается, если |z2-z1|<=E
Z1 начальное =2+2/5
Z2=2+1/z1
volvo
Ну, по твоему же алгоритму - вот так:
var
z1, z2: real;
eps: real;
done: boolean;

begin
eps := 0.00001;
z1 := 2 + 2/5;
repeat
z2 := 2 + 1/z1;
done := (abs(z2 - z1) < eps);
z1 := z2;
until done;
writeln(z1:10:6);
end.
Casio
Огромное спасибо ;)
Я вот только не пойму зачем дана формула q? Она ведь не используется?
У меня вот еще одна проблема. Задача:
Составить таблицу ступенчатой функции
1.5<=a<=3; da=0.3; 6<x<=10; dx=2. Найти wmax и определить a, x, при которых оно определяется. Дана система (так как там много символов я запишу уравнения в другом виде)
Код

     x*sqrt(x-a)
W=   x*sinx(a*x)
                          Exp(x*Ln(a))
    ------------------------------------------------------
      cos(sqr(a*x-1))*cos(sqr(a*x-1))*cos(sqr(a*x-1))

P.S В системе 3 уравнения ^^. Я реализовал программу таким способом:
Код

program sistema;
uses crt;
const
da=0.3;                                      
dx=2;                                                                    
var                                                                        
a,p,w,w1,w2,w3,maximum,max: real;                                          
i,x: word;                                                                  
begin                                                                      
clrscr;                                                                  
a:=1.5;                                                                  
repeat {cikl po a}                                                    
x:=8;                                                                
repeat {cikl po x}                                                  
w1:=x*sqrt(x-a);                                                  
w2:=x*sin(a*x);                                                    
w3:= Exp(x*Ln(a))/cos(sqr(a*x-1))*cos(sqr(a*x-1))*cos(sqr(a*x-1));            
if w1>w2 then max:=w1 else max:=w2;                            
if max>w3 then maximum:=max else maximum:=w3;                  
if maximum>max then                                            
begin                                                          
maximum:=maximum;                                              
writeln('W max = ',maximum:2:1);                                
write(' a = ',a:2:0);                                          
writeln('; x = ',x);                                            
end;                                                            
x:=x+dx;                                                          
until(x>10);                                                        
a:=a+da;                                                            
until(a>3);                                                          
readln;                                                                  
end.    

Вообщем. Wmax я нашел. По условию надо найти "Найти wmax и определить a, x, при которых оно определяется.". Выше указанным моим кодом выдается несколько вариантов:
Код

W max = 356.9
a =  2; x = 10
W max = 2223.8
a =  2; x = 10
W max = 2301.2
a =  3; x = 8
W max = 34499.8
a =  3; x = 10

Где верный вариант только
W max = 34499.8
a = 3; x = 10
Как видно он находит и max и при каких a и x. Но мне мешают остальные три варианта при выводе. Собственно, помогите подправить программу. Возможно, где то условие не верно в цикле.
volvo
Цитата
Я вот только не пойму зачем дана формула q? Она ведь не используется?

Формула q - это для рекурсивного вычисления "золотого сечения"... Посмотри, как она представлена: там итерацией даже и не пахнет no1.gif

Теперь по поводу второй программы:
Цитата
Дана система (так как там много символов я запишу уравнения в другом виде)

Ты бы как-то объяснил по-другому, т.к. то, что ты написал - полный бред с математической точки зрения... Это значит, что
Цитата
        x*sqrt(x-a)
W=  x*sinx(a*x)
        ...
Одновременно??? Или все-таки так:
Цитата
W = x*sqrt(x-a) , если { 1-е дополнительное условие }
W = x*sinx(a*x) , если { 2-е дополнительное условие }
...
Guest
Цитата
Ты бы как-то объяснил по-другому, т.к. то, что ты написал - полный бред с математической точки зрения... Это значит, что

Вообщем одновременно.
Цитата
        x*sqrt(x-a)
W=  x*sinx(a*x)
        ...

После W= идет фигурная скобка и 3 уравнения
Casio
Ну, так что есть предложения? sad.gif
volvo
Так пойдет?
program sistema;
uses crt;
const
da=0.3;
dx=2;

function max(a, b: real): real;
begin
max := a;
if b > a then max := b;
end;

var
a, max_a,
p, w1, w2, w3, maximum, next: real;
i, x, max_x: word;
begin
clrscr;
a:=1.5;

maximum := -maxint;
repeat

x:=8;
repeat

w1:=x*sqrt(x-a);
w2:=x*sin(a*x);
w3:= Exp(x*Ln(a))/cos(sqr(a*x-1))*cos(sqr(a*x-1))*cos(sqr(a*x-1));

next := max(max(w1, w2), w3);

if maximum < next then begin
maximum := next;
max_a := a; max_x := x
end;

x:=x+dx;

until(x>10);

a:=a+da;
until(a>3);

writeln('W max = ',maximum:2:1);
writeln(' a = ', max_a:2:0, '; x = ',max_x);
readln;
end.
Casio
Да. Огромное спасибо.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.