Решить линейную систему уравнений - PullRequest
2 голосов
/ 03 мая 2020

У меня есть две (математические) функции:

y = x
y = -2x + 3

Это решается с помощью y = 1 и x = 1. Смотрите картинку:

enter image description here

Как я могу заставить Джулию сделать это для меня?

1 Ответ

6 голосов
/ 03 мая 2020

Это набор линейных уравнений, поэтому сначала переставьте их следующим образом:

-x + y = 0
2x + y = 3

, и вы увидите, что они имеют форму системы линейных уравнений A*v=b где. A - это матрица:

julia> A = [-1 1; 2 1]
2×2 Array{Int64,2}:
 -1  1
  2  1

и b - это вектор:

julia> b = [0, 3]
2-element Array{Int64,1}:
 0
 3

Теперь v содержит неизвестные вам переменные x и y. Теперь вы можете решить систему, используя левый оператор деления \:

julia> A\b
2-element Array{Float64,1}:
 1.0
 1.0

Если у вас была более общая система нелинейных уравнений, вы должны использовать пакет NLsolve.jl:

julia> using NLsolve

julia> function f!(F, v)
           x = v[1]
           y = v[2]
           F[1] = -x + y
           F[2] = 2*x + y - 3
       end
f! (generic function with 1 method)

julia> res = nlsolve(f!, [0.0; 0.0])
Results of Nonlinear Solver Algorithm
 * Algorithm: Trust-region with dogleg and autoscaling
 * Starting Point: [0.0, 0.0]
 * Zero: [1.0000000000003109, 0.9999999999999647]
 * Inf-norm of residuals: 0.000000
 * Iterations: 2
 * Convergence: true
   * |x - x'| < 0.0e+00: false
   * |f(x)| < 1.0e-08: true
 * Function Calls (f): 3
 * Jacobian Calls (df/dx): 3

julia> res.zero
2-element Array{Float64,1}:
 1.0000000000003109
 0.9999999999999647

(обратите внимание, что в f! мы определяем два выхода F[1] и F[2] равными нулю - вы должны перестроить свои уравнения таким образом).

Для получения более подробной информации о том, как использовать NLsolve.jl см. https://github.com/JuliaNLSolvers/NLsolve.jl.

...