Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2012, 22:46   #1
MAV_alex
Новичок
Джуниор
 
Регистрация: 23.04.2012
Сообщений: 1
По умолчанию Приближение функций методом Чебышева. Упрощение многочлена. Visual Basic 6.0

Здравствуйте, уважаемые форумчане! Есть проблема: необходимо реализовать программно приближение функции методом Чебышева. предполагается, что пользователь вводит узлы (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
MAV_alex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Visual C++, Visual C#, Visual basic .Net, или Microsoft.Net Что лучше? _PROGRAMM_ Общие вопросы .NET 14 10.10.2012 19:24
Решение многочлена методом Горнера Александррррр1 Помощь студентам 0 31.03.2012 13:06
Delphi: аппроксимация функций методом базиса из финитных функций Denna Помощь студентам 1 12.03.2012 19:23