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

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

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2009, 01:18   #1
Dewastik
 
Регистрация: 24.02.2009
Сообщений: 3
По умолчанию Помогите найти ошибку плиз

Мне необходимо найти все значения аргумента при значении функции равному 0, написал код тока проблема в том что напутал с шагом и немогу найти, вот код:
Код:
Sub Расчет_Щелкнуть()
mm:
    a = InputBox("Введите первый предел < 0.", "Ввод параметра", -1)
    If a >= 0 Then
    MsgBox ("Неправильно введен параметр! Попробуйте еще раз.")
GoTo mm
    End If
mmm:
    b = InputBox("Введите второй предел > 0.", "Ввод параметра", 1)
    If b <= 0 Then
    MsgBox ("Неправильно введен параметр! Попробуйте еще раз.")
GoTo mmm
    End If
mmmm:
    h = InputBox("Введите точность нахождения > 0.", "Ввод параметра", 0.001)
    If h < 0.0000001 Or h > 0.1 Then
    MsgBox ("Неправильно введен параметр! Попробуйте еще раз.")
GoTo mmmm
End If
    Range("A2").Value = "x"
    Range("B2").Value = "y"
    rw = 6
    For x = a To b Step h
        hh = h
        y = Sin(x - 1) + Log(2 * x ^ 2 + 3) / (4 + (5 * x - 1) ^ 2)
        If y > 0 Then
        Call pl(a, b, hh, y, h, x)
        Else
        Call mn(a, b, hh, y, h, x)
        End If
        Cells(rw, 1).Value = x
        Cells(rw, 2).Value = y
        Cells(rw, 3).Value = h
        rw = rw + 1
    Next x
End Sub
Public Sub pl(ByVal a, ByVal b, ByVal h, ByRef y, ByRef hh, ByRef x)
For x = a To b Step h
hh = h
y = Sin(x - 1) + Log(2 * x ^ 2 + 3) / (4 + (5 * x - 1) ^ 2)
If y < 0 Then
Exit Sub
End If
Next x
End Sub

Public Sub mn(ByVal a, ByVal b, ByVal h, ByRef y, ByRef hh, ByRef x)
For x = a To b Step h
hh = h
y = Sin(x - 1) + Log(2 * x ^ 2 + 3) / (4 + (5 * x - 1) ^ 2)
If y < 0 Then
Exit Sub
End If
Next x
End Sub
погите плиз

Последний раз редактировалось EducatedFool; 24.05.2009 в 10:40.
Dewastik вне форума Ответить с цитированием
Старый 15.05.2009, 02:20   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
написал код тока проблема в том что напутал с шагом и немогу найти
Ты сам писал этот код? Что-то сомневаюсь...
Уж слишком много лишнего кода, а проверка функция=0 вообще отсутствует...

Попробуй так:

Код:
Sub Расчет_Щелкнуть()
mm:
    a = InputBox("Введите первый предел < 0.", "Ввод параметра", -1)
    If a >= 0 Then MsgBox ("Неправильно введен параметр! Попробуйте еще раз."): GoTo mm
mmm:
    b = InputBox("Введите второй предел > 0.", "Ввод параметра", 1)
    If b <= 0 Then MsgBox ("Неправильно введен параметр! Попробуйте еще раз."): GoTo mmm
mmmm:
    h = InputBox("Введите точность нахождения > 0.", "Ввод параметра", 0.001)
    If h < 0.0000001 Or h > 0.1 Then MsgBox ("Неправильно введен параметр! Попробуйте еще раз."): GoTo mmmm

    Range("A2").Value = "x": Range("B2").Value = "y"
    rw = 6: ActiveSheet.UsedRange.Clear
    Application.ScreenUpdating = False
    For x = a To b Step h
        y = Sin(x - 1) + Log(2 * x ^ 2 + 3) / (4 + (5 * x - 1) ^ 2)
        Cells(rw, 1).Value = x
        Cells(rw, 2).Value = y
        Cells(rw, 3).Value = h
        rw = rw + 1
    Next x
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 15.05.2009, 04:24   #3
Dewastik
 
Регистрация: 24.02.2009
Сообщений: 3
По умолчанию

Я писал сам, но смысл в чем, отделение корней функции методом деления отрезка по палам, поэтому - то я и использовал дополнительно процедуру, т.к. хотел вывести не все а только именно эти значения, смысл метода: если на концах отрезка (подставить значения х в функцию) разные знаки то на етом промежутке ест корень, вот он то мне и нужен, а насчет проверки на ноль то в такой функции вероятность того что я табулируя ее попаду в 0 - 0.000000000000000001 поетому я и не делал проверку

ну точнее 2 процедуры

Обьясню немного подробнее. Необходимо отделить корни функции методом деления отрезка по полам. Суть метода если на отрезке функция принимает значения с разными знаками, то на етом отрезке есть корень По тексту: Получаем начальные параметры. затем проверяем знак функции + или -, в зависимости от знака вызываем процедуру, которые выполняют одни и те же действия: проверяют значение функции покуда она не поменяет знак, затем прерывается и передает в процедуру параметры х и у которые и нужны шаг мона и не передавать. затем выводятся искомые значения и по новому кругу. У меня чего то не правильно работает скорее всего, что то не то или не так передаю в главную процедуру, но не могу понять что именно.

Последний раз редактировалось EducatedFool; 24.05.2009 в 10:39.
Dewastik вне форума Ответить с цитированием
Старый 15.05.2009, 15:59   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

во вложении поиск решения методом деления отрезка пополам.
варианты с формулами и с ВБА.
В примере найден один из корней функции у = х^2 - 3x + 1 (кстати, второй между х=2 и х=3)
Для получения решения для вашей функции с помощью ВБА достаточно переписать код, выделенный красным
Код:
Function Fx(x As Double) As Double
  Fx = x ^ 2 - 3 * x + 1
End Function
возможно, исправить точность вычисления (Const T = 0.0001)

Для получения решения в таблице (с помощью формул) процедура по-сложнее:
1. в строке с первым приближением под у1 пишем новую формулу ссылаясь на значение под х1.
2. копируем ее и вставляем в две соседние ячейки под у2 и у (4-я строка, 6, 7 колонки)
3. вставляем ее еще раз в три ячейки на строку ниже (5-я строка, 5, 6, 7 колонки)
4. копируем строку с вторым приближением (строка 5 таблицы)
5. вставляем скопированную строку в 20-30 строк ниже.
6. задаем х1, х2 для первого приближения (строка 4)
7. возможно задать другую точность вычислений

Вообще задача стоит найти значение х, при котором у = 0. В связи с тем, что используется приближенный метод, точность в обоих случаях задает насколько вычисленное значение функции может отличаться от нуля
Вложения
Тип файла: rar Книга98.rar (9.9 Кб, 10 просмотров)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 15.05.2009 в 16:18.
IgorGO вне форума Ответить с цитированием
Старый 15.05.2009, 19:37   #5
Dewastik
 
Регистрация: 24.02.2009
Сообщений: 3
По умолчанию

Спасибо большое все так, но если функция будет Sin(x) (например) а отрезок большой, ведь если 2 корня (к премеру или больше) то функция на обеих концах будет положительна. Просто вводимый отрезок мне не известен.
Dewastik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти ошибку Pirat_of Microsoft Office Access 2 08.05.2009 00:42
Помогите найти ошибку Anat JavaScript, Ajax 12 28.01.2009 23:50
помогите найти ошибку MyQwErTy Помощь студентам 1 05.11.2008 21:24
помогите найти ошибку в коде плиз Айат Помощь студентам 2 01.10.2008 17:43