2014 dxdy logo

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

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




 
 Помогите формулку пропаскалить...
Сообщение12.03.2010, 00:12 
$N/N_{0}=erfc(x/([math]$sqrt Dt$))=1-erf(x/(2*sqrt Dt))$[/math]

$sqrt{a}$

 
 
 
 Re: Помогите формулку пропаскалить...
Сообщение12.03.2010, 00:29 
ЕМНИП, в Паскале нет функции erf(). Придётся реализовывать самому, например, вот так:
Код:
# from: http://www.cs.princeton.edu/introcs/21function/ErrorFunction.java.html
# Implements the Gauss error function.
#   erf(z) = 2 / sqrt(pi) * integral(exp(-t*t), t = 0..z)
#
# fractional error in math formula less than 1.2 * 10 ^ -7.
# although subject to catastrophic cancellation when z in very close to 0
# from Chebyshev fitting formula for erf(z) from Numerical Recipes, 6.2
def erf(z):
        t = 1.0 / (1.0 + 0.5 * abs(z))
        # use Horner's method
        ans = 1 - t * math.exp( -z*z -  1.26551223 +
                                                t * ( 1.00002368 +
                                                t * ( 0.37409196 +
                                                t * ( 0.09678418 +
                                                t * (-0.18628806 +
                                                t * ( 0.27886807 +
                                                t * (-1.13520398 +
                                                t * ( 1.48851587 +
                                                t * (-0.82215223 +
                                                t * ( 0.17087277))))))))))
        if z >= 0.0:
                return ans
        else:
                return -ans

 
 
 
 Re: Помогите формулку пропаскалить...
Сообщение12.03.2010, 00:35 
Да, да, не нашла этой функции
Я писала программу для того, чтобы найти значения функции - программа простая - надо было задать формулу, по которой в цикле посчитались и вывелись бы нужные значения. Однако возникает ошибка: error while linking, почему-то, перел последним end.
Подскажите, пожалуйста, как исправить?
А программу надо было такую:
"Расчет диффузионных профилей" - называется так,

N/N(нулевое)=erfc(x/корень(Dt))=1-erf(x/(2*корень(Dt))
только я в паскале не нашла функцию эрфактум..., поэтому переписала в ПРОСТОМ варианте:
y=(1/(1+a1*x/(2*корень(Dt))+a2*(x/(корень(Dt)))^2+a3*(x/(корень(Dt)))^3+a4*(x/(корень(Dt)))^4)^4)-0,01
где D=10^(-10) - десять в минус десятой степени
t=60 секунд
a1=0,278393
a2=0,230389
a3=0,000972
a4=0,078108
Получилась программа:
Var
x,y,a1,a2,a3,a4,t,h:real;
begin
a1:=0.278393;
a2:=0.230389;
a3:=0.000972;
a4:=0.078108;
x:=0.29;
t:=60;
h:=10000/(2*sqrt(t));
while x<=1.26 do
begin
y:=-0.01+1/sqr(sqr(1+sqr(a1*x*h+a2*(x*h))+sqr(a3*x*h)*a3*x*h+ sqr(sqr(a4*x*h))));
writeln ('x= ' ,x:4:2, ' y= ',y:8:6);
x:=x+0.03;
end;
readln;
end.

Причем, надо еще график тоже в паскале построить, а потом все это в маткаде сделать, но эта ошибка все время появляется, подскажите, как ее исправить...
Нам сказали, что х будет с двумя знаками после запятой, а у - с 6 знаками после запятой...

Мне не удается запустить программу во FREE PASCAL

Но если y всегда -0,01, может быть, подскажете, пожалуйста, как поступить в этом случае???
Может, тип переменных какой-нибудь другой надо...


кроме того, нам дали формулу: N/N(нулевое)=erfc(x/корень(Dt))=1-erf(x/(2*корень(Dt))
где эта самая функция erf(z) от какой-то переменной z определяется так:
erf(z)=1-1/[(1+a1*z+a2*z^2+a3*z^3+a4*z^4)^4]+E(z) где E(z)=0,01 и промежуток х [0,29;1,26]

График - кривая, нам сказали, похожа на ветвь обычной гиперболы, убывающей в 1 четверти...
Подскажите, прошу...

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


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