/
mill
/
emp
Обзор
Документация
Войти
/
mill
/
emp
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
wave/wave.go
102 строки
4 KB
EdieLay
Убрана проверка одного условия в начале решения в wave
15 май 2024, 08:09
15 май 2024, 08:09
db42902
Код
Авторство
О чём код?
package wave import ( "gitverse.ru/EdieLay/emp/calculus" ) // WaveParameters - параметры волнового уравнения. Граничные условия всегда равны нулю type WaveParameters struct { H float64 `json:"deltaX"` T0 float64 `json:"t0"` DeltaT float64 `json:"deltaT"` N int `json:"totalX"` // Количество точек сетки по иксу TotalT int `json:"totalT"` // Количество точек сетки по времени ASqr float64 `json:"aSqr"` // параметр a Phi []float64 `json:"phi"` Psi []float64 `json:"psi"` U0 []float64 `json:"u0"` // краевое условие слева UN []float64 `json:"uN"` // краевое условие справа LeftOdd bool `json:"leftOdd"` RightOdd bool `json:"rightOdd"` } // TODO: Написать функцию для валидации WaveParameters // SolveDefaultProblem Находит решение волнового уравнение с помощью метода конечных разностей (Finite Differences Method) func SolveDefaultProblem(wave *WaveParameters) ([][]float64, error) { var aSqr, deltaT, h = wave.ASqr, wave.DeltaT, wave.H // инициализация матрицы решения, строки - временные слои, столбцы - значения функции var u = makeAndFillStartU(wave) var mu = (aSqr * deltaT * deltaT) / (h * h) equationsNumber := wave.N - 2 // количество уравнений в системе equationSystem := calculus.FillEquationSystemForEMPWithFDM(mu, equationsNumber, wave.LeftOdd, wave.RightOdd) // заполнение решения for j := 1; j < wave.TotalT-1; j++ { freeTermsColumn := getFreeTermsColumn(u, wave, mu, j) res, err := calculus.SolveTridiagonalSystem(equationSystem, freeTermsColumn) if err != nil { return u, err } copy(u[j+1][1:], res) fillEdges(u, wave, j) } return u, nil // решение } // ищет первый временной слой по производной Psi и нулевому временному слою func findU1(u0 []float64, derivative []float64, deltaT float64) []float64 { result := make([]float64, len(u0)) for i := 0; i < len(u0); i++ { result[i] = u0[i] + deltaT*derivative[i] } return result } func makeAndFillStartU(wave *WaveParameters) [][]float64 { var u = make([][]float64, wave.TotalT) for i := 0; i < wave.TotalT; i++ { u[i] = make([]float64, wave.N) } u[0] = wave.Phi u[1] = findU1(wave.Phi, wave.Psi, wave.DeltaT) return u } func getFreeTermsColumn(u [][]float64, wave *WaveParameters, mu float64, j int) []float64 { var equationsNumber = wave.N - 2 // количество уравнений в системе freeTermsColumn := make([]float64, equationsNumber) // столбец свободных членов for i := 0; i < equationsNumber; i++ { freeTermsColumn[i] = 2*u[j][i+1] - u[j-1][i+1] } var h = wave.H if wave.LeftOdd { freeTermsColumn[0] += mu * wave.U0[j+1] } else { freeTermsColumn[0] += mu * h * wave.U0[j+1] } if wave.RightOdd { freeTermsColumn[equationsNumber-1] += mu * wave.UN[j+1] } else { freeTermsColumn[equationsNumber-1] += mu * h * wave.UN[j+1] } return freeTermsColumn } func fillEdges(u [][]float64, wave *WaveParameters, j int) { if wave.LeftOdd { u[j+1][0] = wave.U0[j+1] } else { u[j+1][0] = u[j+1][1] - wave.H*wave.U0[j+1] } if wave.RightOdd { u[j+1][wave.N-1] = wave.UN[j+1] } else { u[j+1][wave.N-1] = u[j+1][wave.N-2] + wave.H*wave.UN[j+1] } }