Здравствуйте, уважаемые форумчане! Есть проблема: необходимо реализовать программно приближение функции методом Чебышева. предполагается, что пользователь вводит узлы (Xi и Yi) и программа создаёт по этим данным приближающий многочлен Чебышева с указанной точностью. Сам метод приближения я сделал, но он выдаёт многочлен, например такой:
Код:
y=27,56454+7,531632*(x-0,4911745)-47,29167*((x-0,7511694)*((x-0,4911745))-(9,353671E-02)*(1))
а надо вида
Код:
y=a*x^n+b*x^(n-1)+c*x^(n-1)+......+z
то есть, правильный (упрощённый). Искал в Интернете алгоритмы упрощения функций, но там очень много не понятного (обратная польская нотация и ещё что - то). Преподаватель намекнул, что многочлены fi надо сохранять не в виде строк, а в виде массива коэффициентов. Но ведь их количество зависит от вводимых данных, и сложность (длина) этого fi тоже непостоянна: fi0=1, fi1=(x-alpha), fi2=fi1*(x-beta)*(x-gamma) и так далее. Никак не могу придумать как это сделать, помогите пожалуйста. Буду признателен за любую помощь.
Код моей программы:
Код:
Call reader ' получили значения иксов и игреков в массивы X(), Y() с ввода пользователя
Dim pr As Single, chysl As Single, znam As Single, sumyi As Single, sumxi As Single
ReDim f(rz)
ReDim a(rz)
f(0) = 1
'найдём a0
'rz - кол - во узлов
For i = 1 To rz
sumyi = sumyi + y(i)
Next i
a(0) = sumyi / rz
sumxi = 0
For i = 1 To rz
sumxi = sumxi + x(i)
Next i
pr = sumxi / rz
f(1) = "(" & "x" & "-" & pr & ")"
'найдём a1
For i = 1 To rz
chysl = chysl + y(i) * fizn(1, x(i))
znam = znam + fizn(1, x(i)) ^ 2
Next i
a(1) = chysl / znam
'fizn(i,x) - вычисление значения фи
Dim bet() As Single, gam() As Single, bz As String, gz As String
ReDim bet(rz)
ReDim gam(rz)
'bet(2) = 60
'gam(2) = 99
r = 1
Do
r = r + 1
'находим бета и гамма - коеф -ты рекурсивной функции
bet(r) = beta(r, rz)
gam(r) = gamma(r, rz)
' определяем знак перед бета и гамма
If bet(r) >= 0 Then
bz = "+"
Else
bz = "-"
End If
If gam(r) >= 0 Then
gz = "+"
Else
gz = "-"
End If
'r=r+1 по формуле
f(r) = "(" & "(x" & bz & Abs(bet(r)) & ")*" & "(" & f(r - 1) & ")" & gz & "(" & Abs(gam(r)) & ")" & "*" & "(" & f(r - 2) & "))"
'найдём коефициент a(r)
chysl = 0
znam = 0
For i = 1 To rz
' chysl = chys + y(i) * fizn(r, x(i))
' znam = znam + (fizn(r, x(i) ^ 2)) ^ 2
chysl = chysl + y(i) * fizn(r, x(i))
znam = znam + fizn(r, x(i)) ^ 2
Next i
a(r) = chysl / znam
MsgBox "new r=" & r
MsgBox "a=" & a(r), , r
MsgBox "skv=" & skv(r), , r
MsgBox "fi=" & f(r), , r
Loop Until skv(r) < Val(eps.Text)
' собираем окончательный результат
Dim rezt As String
rezt = "y="
For i = 0 To r
If i = 0 Then
rezt = rezt & a(i)
ElseIf a(i) < 0 Then
rezt = rezt & "-" & Abs(a(i)) & "*" & f(i)
ElseIf a(i) > 0 Then
rezt = rezt & "+" & Abs(a(i)) & "*" & f(i)
End If
Next i
Rezult.Text = rezt