powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите найти в коде ошибку
16 сообщений из 16, страница 1 из 1
Помогите найти в коде ошибку
    #37651289
Fox.RM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго всем времени суток!
Помогите пожалуйста! Составил код аппроксимирующий набор экспериментальных точек методом наименьших квадратов.
При запуске выходит ошибка, не пойму в чем дело, есть подозрения на несоответствие типов данных.

Код: 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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
Private Sub Кнопка11_Click()
Dim n As Variant
n = 8

ReDim ArrayXY(1 To 2, 1 To n) As Integer
 
Dim SumX, SumY, SumX2, SumXY, SumX3, SumX4, SumX2Y, SumLnY, SumXLnY As Double
Dim OPRlin, OPRkvadr, OPRa1, OPRa2, OPRa3 As Double
Dim a1lin, a2lin, a1kvadr, a2kvadr, a3kvadr, a1exp, a2exp, cexp As Double
Dim Xsr, Ysr, S1, S2, S3, Skvadr, Sexp, Slin As Double
Dim Kkor, KdetLin, KdetKvadr, KdetExp As Double
Dim i As Integer

  ArrayXY(1, 1) = поле1.Value
  ArrayXY(1, 2) = поле2.Value
  ArrayXY(1, 3) = поле3.Value
  ArrayXY(1, 4) = поле4.Value
  ArrayXY(1, 5) = поле5.Value
  ArrayXY(1, 6) = поле6.Value
  ArrayXY(1, 7) = поле7.Value
  ArrayXY(1, 8) = поле8.Value
  ArrayXY(2, 1) = Поле34.Value
  ArrayXY(2, 2) = Поле35.Value
  ArrayXY(2, 3) = Поле36.Value
  ArrayXY(2, 4) = Поле37.Value
  ArrayXY(2, 5) = Поле38.Value
  ArrayXY(2, 6) = Поле39.Value
  ArrayXY(2, 7) = Поле40.Value
  ArrayXY(2, 8) = Поле41.Value
  
 SumX = 0
 SumY = 0
 SumXY = 0
 SumX2 = 0
 SumX3 = 0
 SumX4 = 0
 SumX2Y = 0
 SumLnY = 0
 SumXLnY = 0
 
 'Вычисление сумм x, y, x*y, x^2, x^3, x^4, (x^2)*y, Ln(y), x*Ln(y)
 
 For i = 1 To n
 
   SumX = SumX + ArrayXY(1, i)
   SumY = SumY + ArrayXY(2, i)
   SumXY = SumXY + ArrayXY(1, i) * ArrayXY(2, i)
   SumX2 = SumX2 + Sqr(ArrayXY(1, i))
   SumX3 = SumX3 + ArrayXY(1, i) * ArrayXY(1, i) * ArrayXY(1, i)
   SumX4 = SumX4 + Sqr(ArrayXY(1, i)) * Sqr(ArrayXY(1, i))
   SumX2Y = SumX2Y + Sqr(ArrayXY(1, i)) * ArrayXY(2, i)
   SumLnY = SumLnY + Log(ArrayXY(2, i))
   SumXLnY = SumXLnY + ArrayXY(1, i) * Log(ArrayXY(2, i))
  Next i
  
 'Вычисление коэффициентов
 
 OPRlin = 0
 a1lin = 0
 a2lin = 0
 a1kvadr = 0
 OPRkvadr = 0
 a2kvadr = 0
 a2kvadr = 0
 a1exp = 0
 a2exp = 0
 
 OPRlin = n * SumX2 - SumX * SumX
 a1lin = (SumX2 * SumY - SumX * SumXY) / OPRlin
 a2lin = (n * SumXY - SumX * SumY) / OPRlin
 OPRkvadr = n * SumX2 * SumX4 + SumX * SumX3 * SumX2 + SumX2 * SumX * SumX3 - SumX2 * SumX2 * SumX2 - n * SumX3 * SumX3 - SumX * SumX * SumX4
 a1kvadr = (SumY * SumX2 * SumX4 + SumX * SumX2Y * SumX3 + SumX2 * SumXY * SumX3 - SumX2 * SumX2 * SumX2Y - SumY * SumX3 * SumX3 - SumX * SumXY * SumX4) / OPRkvadr
 a2kvadr = (n * SumXY * SumX4 + SumY * SumX3 * SumX2 + SumX2 * SumX * SumX2Y - SumX2 * SumX2 * SumXY - n * SumX3 * SumX2Y - SumY * SumX * SumX4) / OPRkvadr
 a3kvadr = (n * SumX2 * SumX2Y + SumX * SumXY * SumX2 + SumY * SumX * SumX3 - SumY * SumX2 * SumX2 - n * SumXY * SumX3 - SumX * SumX * SumX2Y) / OPRkvadr
 a2exp = (n * SumXLnY - SumX * SumLnY) / OPRlin
 cexp = (SumX2 * SumLnY - SumX * SumXLnY) / OPRlin
 a1exp = Exp(cexp)
 
 'Вычисление средних арифметических x и y
 
 Xsr = SumX / n
 Ysr = SumY / n
 S1 = 0
 S2 = 0
 S3 = 0
 Slin = 0
 Skvadr = 0
 Sexp = 0
 Kkor = 0
 KdetLin = 0
 KdetKvadr = 0
 KdetExp = 0
 
For i = 1 To n
  
   S1 = S1 + (ArrayXY(1, i) - Xsr) * (ArrayXY(2, i) - Ysr)
   S2 = S2 + Sqr(ArrayXY(1, i) - Xsr)
   S3 = S3 + Sqr(ArrayXY(2, i) - Ysr)
   Slin = Slin + Sqr(a1lin + a2lin * ArrayXY(1, i) - ArrayXY(2, i))
   Skvadr = Skvadr + Sqr(a1kvadr + a2kvadr * ArrayXY(1, i) + a3kvadr * ArrayXY(1, i) * ArrayXY(1, i) - ArrayXY(2, i))
   Sexp = Sexp + Sqr(a1exp * Exp(a2exp * ArrayXY(1, i)) - ArrayXY(2, i))
  Next i
  
 'Вычисление коэффициентов корреляции и детерминированности

Kkor = S1 / Sqr(S2 * S3)
KdetLin = 1 - Slin / S3
KdetKvadr = 1 - Skvadr / S3
KdetExp = 1 - Sexp / S3
 
 'Вывод результатов
 
 'Линейная функция
 
 Поле13.Value = a1lin
 Поле15.Value = a2lin
 
 'Квадратичная функция
 Поле21.Value = a1kvadr
 Поле22.Value = a2kvadr
 Поле23.Value = a3kvadr
 
 'Экспоненциальная функция
 
 Поле24.Value = a1exp
 Поле25.Value = a2exp
 Поле26.Value = cexp
 Поле31.Value = Xsr
 Поле32.Value = Ysr
 
 'Коэффициенты функция
 
Поле28.Value = Kkor
Поле29.Value = KdetLin
Поле30.Value = KdetKvadr
Поле33.Value = KdetExp

End Sub



Дополнительно прикладываю скрины.
...
Рейтинг: 0 / 0
Помогите найти в коде ошибку
    #37651291
Fox.RM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
+
...
Рейтинг: 0 / 0
Помогите найти в коде ошибку
    #37651304
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть нам, чтобы отладить твою программу, нужно заново нарисовать эту форму, вбить туда все значения и запустить?

Или может все-таки сжалишься и дашь тестовый файл?
...
Рейтинг: 0 / 0
Помогите найти в коде ошибку
    #37651308
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А самостоятельно можешь

а) попробовать Option Explicit

б) исправить:
Код: vbnet
1.
Dim SumX, SumY, SumX2, SumXY, SumX3, SumX4, SumX2Y, SumLnY, SumXLnY As Double


на
Код: vbnet
1.
2.
Dim SumX As Double, SumY As Double, SumX2 As Double, SumXY As Double, SumX3 As Double
Dim SumX4 As Double, SumX2Y As Double, SumLnY As Double, SumXLnY As Double


(и другие аналогичные сторки)
...
Рейтинг: 0 / 0
Помогите найти в коде ошибку
    #37651311
Fox.RM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProТо есть нам, чтобы отладить твою программу, нужно заново нарисовать эту форму, вбить туда все значения и запустить?

Или может все-таки сжалишься и дашь тестовый файл?

Нет конечно) Я думал, тут по коду понятно станет. Сейчас скину.
...
Рейтинг: 0 / 0
Помогите найти в коде ошибку
    #37651315
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fox.RMпо коду понятно станетпо коду только понятна ошибка в объявлении переменных. А ошибочную строку надо руками пощупать, чтобы не курить твои двести строк
...
Рейтинг: 0 / 0
Помогите найти в коде ошибку
    #37651321
Fox.RM,

аргумент Sqr() отрицательный, скорее всего.
...
Рейтинг: 0 / 0
Помогите найти в коде ошибку
    #37651326
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fox.RM,

ошибка, скорее всего, из-за отрицательного значения аргумента в Sqr. Распечатайте перед присвоением и убедитесь.
...
Рейтинг: 0 / 0
Помогите найти в коде ошибку
    #37651330
Fox.RM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот сам файл. Попробовал Option Explicit ничего не поменялось ;( Вообще никакой реакции;(
...
Рейтинг: 0 / 0
Помогите найти в коде ошибку
    #37651337
Fox.RM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
13-й кварталFox.RM,

аргумент Sqr() отрицательный, скорее всего.

Да отрицательный, а что с этим можно сделать?
...
Рейтинг: 0 / 0
Помогите найти в коде ошибку
    #37651354
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Fox.RM
> Да отрицательный, а что с этим можно сделать?

Использовать Abs() для аргумента, но я не знаю, правильно ли это с точки зрения алгоритма вычислений

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите найти в коде ошибку
    #37651369
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fox.RMДа отрицательный, а что с этим можно сделать?если это так, значит ошибка в алгоритме. Сделать - искать ошибку в алгоритме. Ведь чисто математически такой ситуации возникнуть не должно?
...
Рейтинг: 0 / 0
Помогите найти в коде ошибку
    #37651390
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fox.RM, странные у вас вычисления - извлечение корня не из квадрата...
Вроде как по методу наименьших квадратов можно считать сумму квадратов разностей, корень извлекать не обязательно. И считается сразу по обеим координатам. Да и если корень извлекаете - то формула примерно такая:
sum = sum + sqr((x(i) - x0)^2 + (y(i) - y0)^2)
...
Рейтинг: 0 / 0
Помогите найти в коде ошибку
    #37651429
Fox.RM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь Горбонос,

С Abs конечно работает, но вот правильно ли... Тестирую.
...
Рейтинг: 0 / 0
Помогите найти в коде ошибку
    #37651435
Fox.RM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM,

Хорошо, учту.
...
Рейтинг: 0 / 0
Помогите найти в коде ошибку
    #37651445
Fox.RM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, при сверке с Excel расхождения пока происходят.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите найти в коде ошибку
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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