ИСН, было рассмотрено около десятка конструкций четырехпараметрических формул, но дала результат только приведенная выше. Видимо, не все они беспредельно гибки, а уж собаку даже на земле не станут подгонять.
Теперь все по порядку. Думаю, многим будет полезно. Не знаю, причем тут в первой формуле единица, ибо меня интересует производная, для которой эта единица - что шмель для слона. Мы с коллегой выяснили важное обстоятельство: параметр
должен быть строго отрицательным. Знаки остальных трех параметров пока неизвестны. Чтобы особо не возиться с этим делом, решено было перебрать все варианты знаков. Их оказалось восемь. Была составлена комбинаторная таблица начальных параметров коэффициентов (файл "
k8.txt)":
Код:
-1 1 1 1
-1 1 1 -1
-1 1 -1 1
-1 -1 1 1
-1 1 -1 -1
-1 -1 1 -1
-1 -1 -1 1
-1 -1 -1 -1
Составлена блиц-программа, которая вчерне просчитывает наилучшие числовые значения параметров для этих восьми сочетаний знаков. Вот ее текст:
Код:
open #1,"c.txt","r"
open #2,"k8.txt","r"
open #3,"8.txt","w"
dim x(100),y(100),f1(100)
z=.01
for i=1 to 20
input #1 x(i),y(i)
next i
for v=1 to 8
print v
input #2 a0,b0,c0,d0
s1=10^100:nn=100000
for j=1 to nn
a=a0*(1+z*(ran()-.5))
b=b0*(1+z*(ran()-.5))
c=c0*(1+z*(ran()-.5))
d=d0*(1+z*(ran()-.5))
s=0
for i=1 to 20
x=x(i)
f1(i)= -a*x^(b*x^c+d-1)*(b*x^c*(c*log(x)+1)+d)*exp(a*x^(b*x^c+d))
s=s+(y(i)-f1(i))^2
next i
if s<=s1 then
ak=a:bk=b:ck=c:dk=d:sk=s
s1=s
a0=a:b0=b:c0=c:d0=d
fi
next j
print #3,ak,bk,ck,dk,sk
next v
Самая длинная строка - это и есть производная, то есть наша аппроксимирующая функция. Методом Монте-Карло по прохождении 100 тыс. циклов печатаются значения
, где
сумма квадратов отклонений. Таблица с именем
8.txt получилась такой:
Код:
-0.3740618 0.0616409 0.0120472 3.4532580 0.053564034
-0.373893 3.6169980 0.0004765 -0.1021912 0.053630939
-0.324076 3.2485257 -0.5476564 0.9644940 0.001408661
-0.323134 -10.9611253 0.1314949 15.1276809 0.002662473
-0.323708 4.7222391 -0.3580727 -0.5164878 0.001503931
-62.496773 -0.1210748 0.1484497 -0.0054732 3.618862915
-0.394588 -0.0299906 -3.5460164 3.4178397 0.035515651
-54.152601 -0.7514125 -3.7945881 -0.3290997 3.618862915
Третий вариант оказался наиболее близким, так как сумма квадратов отклонений равна всего
Его и рассмотрим более тщательно. Текст проги:
Код:
open #1,"c.txt","r"
dim x(100),y(100),f1(100)
z=.00001
for i=1 to 20
input #1 x(i),y(i)
next i
a0=-.32:b0=3.25:c0=-.55:d0=.96
s1=10^100:nn=1000000
for j=1 to nn
a=a0*(1+z*(ran()-.5))
b=b0*(1+z*(ran()-.5))
c=c0*(1+z*(ran()-.5))
d=d0*(1+z*(ran()-.5))
s=0
for i=1 to 20
x=x(i)
f1(i)= -a*x^(b*x^c+d-1)*(b*x^c*(c*log(x)+1)+d)*exp(a*x^(b*x^c+d))
s=s+(y(i)-f1(i))^2
next i
if s<=s1 then
print a,b,c,d,s
s1=s
a0=a:b0=b:c0=c:d0=d
fi
next j
Здесь уже миллион циклов (на моем компе время счета около 5 с.). Скриншот конца итераций получился такой:
Следовательно:
Сумма квадратов отклонений
График кривой визуально мало чем отличается от того, что приводилось выше.
Интеграл аппроксимирующей функции при любых параметрах равен 1 ( см.
http://www.wolframalpha.com/input/?i=ev ... ..infty%29 )