2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 нужна помощь в программировании,буду признателен
Сообщение05.01.2011, 00:05 
Всем привет!Первый раз тут.Мне нужно написать программу на метод половинного деления запрограммировать нужно эту функцию, как бы я ни старался но у меня ничего не выходит ... все параметры кроме x и a являются константами, мне нужно чтобы для каждого a было найдено соответствующее x, параметр а меняется от 10^-7 до 10^-2
$$f(x) = {3\gamma p_2\frac{xa^2\rho_1c_1}\lambda:(\frac{xa^2\rho_1c_1}\lambda}+\beta(1+\sqrt{\frac{xa^2\rho_1c_1}\lambda}))-\frac{2\sigma}{a}=0

 
 
 
 Re: нужна помощь в программировании,буду признателен
Сообщение05.01.2011, 08:47 
Для начала, переведите выражение для $f(x)$ на используемый вами язык программирования. Фиксируете $a$, выбираете (можно вручную) отрезок $[x_1;\ x_2]$ такой, что $f(x_1)f(x_2)<0$. Делите выбранный отрезок на две (равные) части и (рекурсивно) применяете описанный алгоритм к ним (т.е. выбираете из двух частей ту, на концах которой функция меняет знак, ну а дальше понятно). Это все делаете пока отрезок не станет ну совсем уж маленьким или (что лучше) пока слишком маленькой не станет значение функции в точке разбиения.

Псевдокод:
Код:
x1=...; x2=...; // assert(f(x1)*f(x2)<0);
Root=0;
eps=0.0001;

while(1)
{
    Root=x1+(x1+x2)/2; // Midpoint.

    if(f(Root)<eps) break; // Check solution.

    if(f(x1)*f(Root)<0)
        x2=Root;
    else
        x1=Root;
};

Yield(Root);


Примерно так, наверное...

 
 
 
 Re: нужна помощь в программировании,буду признателен
Сообщение05.01.2011, 09:51 
Здесь нужно подсчитать методом пол деления функцию F1:=(3*y*p20*Y*Y)/(Y*Y+betta*(1+y))+r01*x*x*x0*x0+4*r01*v1*x-2*sigma/x0; и ту которую написал выше F2:=(3*y*p20*Y*Y)/(Y*Y+betta*(1+y))-2*sigma/x0,но самое интересное то что в этой проге есть некая функция lya_t,которая получилась путем решения уравнения F2=0 и выражением из этого уравнения x в данном случае мы его назвали как lya_t, и соответственно стоит задача такая, значения которые должны получится для пол деления для функции F2 и lya_t должны совпадать,так как это одно и тоже уравнение.
вопрос такой,что в этой программе не так?ведь казалось бы значения F2 и lya_t должны совпадать так как это одна и таже функция, но этого не происходит!Почему?


program inkrement;
uses crt;
var f,f1:text;
procedure lya_t(x0:real);
var
p0,p20,y,T0,r01,r02,cp1,cp2,lambda1,lambda2,v1,sigma,lambda_t,l,betta,vT,xi,eta,p2,E,A,lyambda_t:real;
begin
p0:=101325;
T0:=351;
y:=1.133;
r01:=757;
r02:=1.4347;
cp1:=7230;
cp2:=1690;
lambda1:=0.1548;
lambda2:=0.0246;
v1:=0.000061162;
sigma:=0.0173;
l:=975100;
vT:=lambda1/(r01*cp1);
xi:=(cp2*T0)/l;
eta:=(r01*cp1)/(r02*cp2); {безразмерный коэффициент}
p2:=p0+(2*sigma)/x0;
E:=(2*sigma)/(3*y*x0*p2);
A:=3*(y-1)*eta*xi*xi*E/(1-E);
lambda_t:=(vT*(A/2+sqrt(A*A/4+A))/(x0*x0));
write(f,' ', lambda_t);
end;

procedure poldel(x0,x,z:real);
var
p0,p20,y,a0,T0,r01,r02,cp1,cp2,lambda1:real;
lambda2,v1,sigma,l,betta,e,e1,c,Ya,Yb,Yc,Fa,Fb,Fc,xi:real;
begin
p0:=101325;
T0:=351;
y:=1.133;
r01:=757;
r02:=1.4347;
cp1:=7230;
cp2:=1690;
lambda1:=0.1548;
lambda2:=0.0246;
v1:=0.000061162;
sigma:=0.0173;
l:=975100;
xi:=(cp2*T0)/l;
betta:=3*(y-1)*((r01*cp1)/(r02*cp2))*xi*xi;
e:=0.00001;
e1:=(z-x)/2;
while e1>e do
begin
c:=(x+z)/2;
p20:=p0+(2*sigma)/x0;
Ya:=sqrt((x*x0*x0*r01*cp1)/lambda1);

Fa:=(3*y*p20*Ya*Ya)/(Ya*Ya+betta*(1+y))+r01*x*x*x0*x0+4*r01*v1*x-2*sigma/x0;

Yb:=sqrt((z*x0*x0*r01*cp1)/lambda1);

Fb:=(3*y*p20*Yb*Yb)/(Yb*Yb+betta*(1+y))+r01*z*z*x0*x0+4*r01*v1*z-2*sigma/x0;

Yc:=sqrt((c*x0*x0*r01*cp1)/lambda1);

Fc:=(3*y*p20*Yc*Yc)/(Yc*Yc+betta*(1+y))+r01*c*c*x0*x0+4*r01*v1*c-2*sigma/x0;
e1:=(z-x)/2;
writeln(f1,x,'',Fa,'',z,'',Fb,'',c,'',Fc);
if Fa*Fb<0 then
begin
if Fa*Fc<0 then z:=c;
if Fc*Fb<0 then x:=c;

end
else writeln('kornay net');
end;
if e1<e then writeln(f,' ', x:0:5);
end;
begin
clrscr;
assign(f,'dan_sp1.txt');
rewrite(f);
assign(f1,'temp_sp1.txt');
rewrite(f1);
lya_t(0.0000001);
poldel(0.0000001,0,1000000000);
lya_t(0.0000005);
poldel(0.0000005,0,1000000000);
lya_t(0.000001);
poldel(0.000001,0,1000000000);
lya_t(0.000005);
poldel(0.000005,0,1000000000);
lya_t(0.00001);
poldel(0.00001,0,1000000000);
lya_t(0.00005);
poldel(0.00005,0,1000000000);
lya_t(0.0001);
poldel(0.0001,0,1000000000);
lya_t(0.0005);
poldel(0.0005,0,1000000000);
lya_t(0.001);
poldel(0.001,0,1000000000);
lya_t(0.005);
poldel(0.005,0,1000000000);
lya_t(0.01);
poldel(0.01,0,1000000000);
lya_t(0.05);
poldel(0.05,0,1000000000);
close(f);
close(f1);
end.

 
 
 
 Re: нужна помощь в программировании,буду признателен
Сообщение05.01.2011, 11:46 
поможите? а то я не шарю ничего

 
 
 
 Re: нужна помощь в программировании,буду признателен
Сообщение05.01.2011, 11:52 
:lol:

 
 
 
 Re: нужна помощь в программировании,буду признателен
Сообщение05.01.2011, 20:07 
ну кто нибудь мне поможет????

-- Ср янв 05, 2011 20:59:52 --

я обратился сюда,потому что я ничего не понимаю в программировании вообще ... а помощь нужна,сам метод я понимаю,объяснить смогу,пример простой в прогу вставить и проверить как работает тоже,а тут в простую прогу вгонять такой пример не получается ((( вот прогр которую мне сделали. Здесь нужно подсчитать методом пол деления функцию F1:=(3*y*p20*Y*Y)/(Y*Y+betta*(1+y))+r01*x*x*x0*x0+4*r01*v1*x-2*sigma/x0; и ту которую написал выше F2:=(3*y*p20*Y*Y)/(Y*Y+betta*(1+y))-2*sigma/x0,но самое интересное то что в этой проге есть некая функция lya_t,которая получилась путем решения уравнения F2=0 и выражением из этого уравнения x в данном случае мы его назвали как lya_t, и соответственно стоит задача такая, значения которые должны получится для пол деления для функции F2 и lya_t должны совпадать,так как это одно и тоже уравнение.


program inkrement;
uses crt;
var f,f1:text;
procedure lya_t(x0:real);
var
p0,p20,y,T0,r01,r02,cp1,cp2,lambda1,lambda2,v1,sigma,lambda_t,l,betta,vT,xi,eta,p2,E,A,lyambda_t:real;
begin
p0:=101325;
T0:=351;
y:=1.133;
r01:=757;
r02:=1.4347;
cp1:=7230;
cp2:=1690;
lambda1:=0.1548;
lambda2:=0.0246;
v1:=0.000061162;
sigma:=0.0173;
l:=975100;
vT:=lambda1/(r01*cp1);
xi:=(cp2*T0)/l;
eta:=(r01*cp1)/(r02*cp2); {безразмерный коэффициент}
p2:=p0+(2*sigma)/x0;
E:=(2*sigma)/(3*y*x0*p2);
A:=3*(y-1)*eta*xi*xi*E/(1-E);
lambda_t:=(vT*(A/2+sqrt(A*A/4+A))/(x0*x0));
write(f,' ', lambda_t);
end;

procedure poldel(x0,x,z:real);
var
p0,p20,y,a0,T0,r01,r02,cp1,cp2,lambda1:real;
lambda2,v1,sigma,l,betta,e,e1,c,Ya,Yb,Yc,Fa,Fb,Fc,xi:real;
begin
p0:=101325;
T0:=351;
y:=1.133;
r01:=757;
r02:=1.4347;
cp1:=7230;
cp2:=1690;
lambda1:=0.1548;
lambda2:=0.0246;
v1:=0.000061162;
sigma:=0.0173;
l:=975100;
xi:=(cp2*T0)/l;
betta:=3*(y-1)*((r01*cp1)/(r02*cp2))*xi*xi;
e:=0.00001;
e1:=(z-x)/2;
while e1>e do
begin
c:=(x+z)/2;
p20:=p0+(2*sigma)/x0;
Ya:=sqrt((x*x0*x0*r01*cp1)/lambda1);

Fa:=(3*y*p20*Ya*Ya)/(Ya*Ya+betta*(1+Ya))+r01*x*x*x0*x0+4*r01*v1*x-2*sigma/x0;

Yb:=sqrt((z*x0*x0*r01*cp1)/lambda1);

Fb:=(3*y*p20*Yb*Yb)/(Yb*Yb+betta*(1+Yb))+r01*z*z*x0*x0+4*r01*v1*z-2*sigma/x0;

Yc:=sqrt((c*x0*x0*r01*cp1)/lambda1);

Fc:=(3*y*p20*Yc*Yc)/(Yc*Yc+betta*(1+Yc))+r01*c*c*x0*x0+4*r01*v1*c-2*sigma/x0;
e1:=(z-x)/2;
writeln(f1,x,'',Fa,'',z,'',Fb,'',c,'',Fc);
if Fa*Fb<0 then
begin
if Fa*Fc<0 then z:=c;
if Fc*Fb<0 then x:=c;

end
else writeln('kornay net');
end;
if e1<e then writeln(f,' ', x:0:5);
end;
begin
clrscr;
assign(f,'dan_sp1.txt');
rewrite(f);
assign(f1,'temp_sp1.txt');
rewrite(f1);
lya_t(0.0000001);
poldel(0.0000001,0,1000000000);
lya_t(0.0000005);
poldel(0.0000005,0,1000000000);
lya_t(0.000001);
poldel(0.000001,0,1000000000);
lya_t(0.000005);
poldel(0.000005,0,1000000000);
lya_t(0.00001);
poldel(0.00001,0,1000000000);
lya_t(0.00005);
poldel(0.00005,0,1000000000);
lya_t(0.0001);
poldel(0.0001,0,1000000000);
lya_t(0.0005);
poldel(0.0005,0,1000000000);
lya_t(0.001);
poldel(0.001,0,1000000000);
lya_t(0.005);
poldel(0.005,0,1000000000);
lya_t(0.01);
poldel(0.01,0,1000000000);
lya_t(0.05);
poldel(0.05,0,1000000000);
close(f);
close(f1);
end.

 
 
 
 Re: нужна помощь в программировании,буду признателен
Сообщение05.01.2011, 21:08 

(Оффтоп)

Oh gods! :shock:

 
 
 
 Re: нужна помощь в программировании,буду признателен
Сообщение05.01.2011, 23:54 
Аватара пользователя
 i 
Правила форума в http://dxdy.ru/post27358.html#p27358 писал(а):
Форум способствует процессу обучения и образования, а не процессу сдачи зачетов и экзаменов, тем более при отсутствии необходимых для этого знаний.
kinomu, если у Вас есть конкретные затруднения, объясните, в чём они заключаются (понять что-либо из Вашего сообщения абсолютно невозможно). Если же Вам надо, чтобы кто-то сделал задание за Вас, Вы ошиблись форумом.

Пока едем в Карантин.

После того как исправите сообщение, сообщите об этом в теме Сообщение в карантине исправлено.

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group