powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помощь/совет новичку
8 сообщений из 8, страница 1 из 1
Помощь/совет новичку
    #39436137
Sandy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Хотел решить с виду простую задачку методом итераций с помощью VB, т.к. изучал его один семестр лет 12 назад. Скачал VB 2010, думал, что сразу все вспомню. Но у меня ничего не вышло. Может, кто подскажет, в чем собака зарыта. Порылся в нете, все примеры с операторами Do Loop Until. Но свой пример как-то с их помощью не могу оформить.

Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim S, D, GHA1, D1, A1, GHA2, D2, A2 As Decimal
S = TextBox1.Text
D = TextBox2.Text
GHA1 = TextBox3.Text
D1 = TextBox4.Text
A1 = TextBox5.Text
GHA2 = TextBox6.Text
D2 = TextBox7.Text
A2 = TextBox8.Text

Dim F(0 To 1000) As Decimal
Dim L(0 To 1000) As Decimal

For i = 1 To 1000

F(0) = S
L(i) = Math.Acos((Math.Sin(A1) - Math.Sin(F(i - 1)) * Math.Sin(D1)) / (Math.Cos(F(i - 1)) * Math.Cos(D1))) - GHA1

Dim N, O, P As Decimal
N = Math.Sin(D2)
O = Math.Cos(D2) * Math.Cos(GHA1 + L(i))
P = Math.Sin(A2)

F(i) = Math.Asin(P / (N ^ 2 + O ^ 2) ^ 0.5) - Math.Atan(O / N)

If Math.Abs(F(i) - F(i - 1)) < 0.003 And Math.Abs(L(i) - L(i - 1)) < 0.003 Then
TextBox9.Text = F(i)
TextBox10.Text = L(i)
End If

If Math.Abs(F(i) - F(i - 1)) < 0.003 And Math.Abs(L(i) - L(i - 1)) < 0.003 Then
GoTo 41
End If

Next
41:
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
End
End Sub

End Class
...
Рейтинг: 0 / 0
Помощь/совет новичку
    #39436139
Sandy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Виноват. Сперва задал вопрос, а потом прочитал, что тут не задают вопросы по VB.NET. Может, все же кто-то что-то да посоветует.
...
Рейтинг: 0 / 0
Помощь/совет новичку
    #39436141
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из советов:
1) Правильно оформляйте сообщения. Для кода используйте тег SRC, а для проверки - кнопку "Просмотр".
2) Формулируйте задачу. В Вашем случае - полную постановку задачи на программирование (со всеми формулами) и выбранный путь решения.
3) Комментируйте свой код так, чтобы любой понял, что, где, как и почему делается.
4) Структурируйте код, чтобы он соответствовал логике, не объединяйте два элементарных действия в одном операторе.
...
Рейтинг: 0 / 0
Помощь/совет новичку
    #39436155
Sandy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Виноват, исправлюсь.
Простите, но как-то кратко описать задачу и алгоритм не получилось.
Задача такова, что необходимо найти φ и λ (это широта и долгота на Земле) из нижеприведенной системы нелинейных трансцендентных уравнений.
sin ho1 = sin φ sin δ1 + cos φ cos δ1 cos(tгр1* + λ)
sin ho2 = sin φ sin δ2 + cos φ cos δ2 cos(tгр2* + λ).
Решал в Maple, но хочется в Бейсике, чтобы был красивый интерфейс. Думал, что просто получится. ho1,2 ; δ1,2 ; tгр1,2 постоянные. Имеются предполагаемые (счислимые) φс;λс, от которых начинаем приближение.
Геометрически итерационный процесс выглядит следующим образом. У каждой последующей точки уточняется одна из координат, например, сначала широта φ, а потом долгота λ.
Сначала подставляю в систему счислимую широту φ= φс и, тем самым, нахожу первое приближение долготы λ= λ1.
cos(tгр1* +λ1)= (sin ho1- sin φс sin δ1)/(cos φс cos δ1).
Откуда
λ1=(tгр1* +λ1)- tгр1* .
Таким образом, найдена первая итеративная точка M1(φс;λ1). Подставляю найденную долготу λ= λ1 во второе уравнение и нахожу первое приближение широты φ= φ1
sin ho2= sin φ1 sin δ2+ cos φ1 cos δ2 cos(tгр2* +λ1).
Уравнение содержит искомую широту φ1 под знаками sin и cos, поэтому его удобно переписать в виде
А sin φ1+В1 cos φ1=N,
где А= sin δ2=const; В1= cos δ2 cos(tгр2* +λ1); N= sin ho2= const.
Для решения данного уравнения возможно использовать различные способы; наиболее удобен - тригонометрический, в итоге найдем приближение широты φ1
tgθ1=B1/A,
sin(φ1+ θ1)= N/ (A^2 + B1^2)^0.5
φ1=( φ1+ θ1)- θ1.
Таким образом, найдена вторая итерационная точка M2(φ1;λ1).
Второе приближение долготы λ= λ2 нахожу по аналогичным формулам, где вместо φс стоит итерация широты φ =φ1
cos(tгр2* EW2)=( sin ho1- sinφ1 sin δ1)/( cos φ1 cos δ1).
Откуда
λ2=(tгр1* +λ2) - tгр1*.
Таким образом, найдена третья итерационная точка: M3(φ1;λ2).
Второе приближение широты φ =φ2 находим по аналогичным формулам. Вместо широты φ1 подставлена искомая широта φ2 , а вместо λ1 - найденная долгота λ2
A sin φ1+В2 cos φ1= N,
где B2 = cosδ2 cos(tгр2* +λ2).

tg θ2= B2/А,
sin(φ2+ θ2)= N/ (A^2 + B2^2)^0.5,
φ2=( φ2+ θ2)- θ2.
Таким образом найдена четвертая итерационная точка M4(φ2;λ2).
По изложенной методике весь итерационный вычислительный цикл продолжается, например, до тех пор, пока одновременно не выполнится
| φi+1 - φi | ≤ε, | λ i+1 - λ i | ≤ε,

где критерий ε = 0.2'.
...
Рейтинг: 0 / 0
Помощь/совет новичку
    #39436156
Sandy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код с пояснениями
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'задаю все постоянные
        Dim S, D, GHA1, D1, A1, GHA2, D2, A2 As Decimal
        S = TextBox1.Text 'счислимая широта
        D = TextBox2.Text 'счислимая долгота

        GHA1 = TextBox3.Text
        D1 = TextBox4.Text
        A1 = TextBox5.Text
        GHA2 = TextBox6.Text
        D2 = TextBox7.Text
        A2 = TextBox8.Text

        Dim F(0 To 1000) As Decimal 'массив значений широты
        Dim L(0 To 1000) As Decimal 'массив значений долготы

        For i = 1 To 1000 'цикл для приближений (число итераций до 1000)

            F(0) = S 'начинаем приближение с счислимой широты

            L(i) = Math.Acos((Math.Sin(A1) - Math.Sin(F(i - 1)) * Math.Sin(D1)) / (Math.Cos(F(i - 1)) * Math.Cos(D1))) - GHA1 'находим приближенную долготу

            Dim N, O, P As Decimal
            N = Math.Sin(D2)
            O = Math.Cos(D2) * Math.Cos(GHA1 + L(i))
            P = Math.Sin(A2)

            F(i) = Math.Asin(P / (N ^ 2 + O ^ 2) ^ 0.5) - Math.Atan(O / N) 'находим приближенную широту с помощью приближенной долготы

            If Math.Abs(F(i) - F(i - 1)) < 0.003 And Math.Abs(L(i) - L(i - 1)) < 0.003 Then 'если выполняется условие по точности, то выводим результат в форму
                TextBox9.Text = F(i)
                TextBox10.Text = L(i)
            End If

            If Math.Abs(F(i) - F(i - 1)) < 0.003 And Math.Abs(L(i) - L(i - 1)) < 0.003 Then 'выходим из цикла, если это коректно??????
                GoTo 41
            End If

        Next
41:
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        End
    End Sub

End Class
...
Рейтинг: 0 / 0
Помощь/совет новичку
    #39436160
Sandy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторСтруктурируйте код, чтобы он соответствовал логике, не объединяйте два элементарных действия в одном операторе.
Простите, тут я не понял, т.к. не программист я. Просто я взял учебник Брайана Сайлера по VB 6, который купил, когда был студентом. Написал код, как мне это виделось. А он не работает. Выдает значения, но они неверные.
...
Рейтинг: 0 / 0
Помощь/совет новичку
    #39436174
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandy83Геометрически итерационный процесс выглядит следующим образом. У каждой последующей точки уточняется одна из координат, например, сначала широта φ, а потом долгота λ.Так, а где Ваше сжимающее отображение целевой функции? И это у Вас не метод итераций, а метод последовательных приближений получается. Ну или покоординатного спуска, если считать целевой функцией смещение расчётной точки от исходного приближения на текущей итерации.

В любом случае - отделите мух от котлет. Реализуйте все эти тригонометрические расчёты в виде отдельных имеющих реальный смысл функций (расчёт такой=-то величины по значениям таких-то), чтобы они не захламляли текст собственно процедуры поиска.Ну и реализуйте функцию расчёта невязки (отклонения). И должна у Вас остаться чистая процедура поиска минимума, оптимума или нуля, применимая к чему угодно, лишь бы механика процесса была правильно реализована соответствующими функциями. И тогда отлаживаться станет легко и приятно.
...
Рейтинг: 0 / 0
Помощь/совет новичку
    #39442693
Sandy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошли праздники, появилось свободное время. Я почитал, нарисовал алгоритм, написал по нему программу. Она вроде бы считает, но результаты не те. Или я снова все неправильно сделал?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'задаю все постоянные
        Dim F, L, F1, L1, F2, L2, GHA1, D1, A1, GHA2, D2, A2 As Decimal
        F = TextBox1.Text 'счислимая широта
        L = TextBox2.Text 'счислимая долгота

        GHA1 = TextBox3.Text
        D1 = TextBox4.Text
        A1 = TextBox5.Text
        GHA2 = TextBox6.Text
        D2 = TextBox7.Text
        A2 = TextBox8.Text

        Do
            L1 = Math.Acos(((Math.Sin(A1) - Math.Sin(F)) * Math.Sin(D1)) / (Math.Cos(F) * Math.Cos(D1))) - GHA1
            'находим первое приближение долготы
            Dim N, O, O1, P As Decimal
            N = Math.Sin(D2)
            O = Math.Cos(D2) * Math.Cos(GHA1 + L1)
            P = Math.Sin(A2)
            F1 = Math.Asin(P / (N ^ 2 + O ^ 2) ^ 0.5) - Math.Atan(O / N) 'находим первое приближение широты с помощью первой приближенной долготы

            L2 = Math.Acos(((Math.Sin(A1) - Math.Sin(F1)) * Math.Sin(D1)) / (Math.Cos(F1) * Math.Cos(D1))) - GHA1
            'находим вторую приближенную долготу
            O1 = Math.Cos(D2) * Math.Cos(GHA1 + L2)
            F2 = Math.Asin(P / (N ^ 2 + O1 ^ 2) ^ 0.5) - Math.Atan(O1 / N) 'находим вторую приближенную широту с помощью второй приближенной долготы

            F = F2 'присваиваем значение второй приближенной широты счислимой широте, чтобы далее рассчитать следующее приближение долготы 

        Loop Until Math.Abs(F2 - F1) > 0.003 And Math.Abs(L2 - L1) > 0.003
        'если выполняется условие по точности, то выводим результат в форму
        TextBox9.Text = F2
        TextBox10.Text = L2
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        End
    End Sub

End Class
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помощь/совет новичку
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]