Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/103: Рейтинг темы: голосов - 103, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 27.04.2015
Сообщений: 17

Метод стрельбы решения краевой задачи

07.03.2017, 09:35. Показов 22863. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую! Не могу разобраться в языке (пишу первую программу). Реализую метод стрельбы для решения краевой задачи. По какой-то причине метод расходится. Если у вас есть какие-то мысли, почему процесс расходится, пожалуйста, напишите.
Python
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
import math
from array import array
 
x=array('f')
y=array('f')
z=array('f')
 
def y1(x):
    return math.e ** x + math.e ** (2 * x) + (0.1 * x - 0.12) * math.cos(x) - (0.3 * x + 0.34) * math.sin(x)
 
def g(x,y,z):
    return x * math.cos(x) + 3 * z - 2 * y
    
ksi = float(input('Input Ksi: '))
 
a,b = 0.0,1.0 
n = 10.0
eps = 0.001
 
def W(ksi):
    x.insert(0,a)
    y.insert(0,ksi)
    z.insert(0,2.76)
    i = 0
    h = (b - a) / n
    while i < int(n-1):
        x.append(x[i] + h)
        y.append(y[i] + h * z[i])
        z.append(z[i] + h * g(x[i],y[i],z[i]))
        i += 1    
    return y[int(n-1)]
 
while math.fabs(W(ksi)-y1(b)) > eps:
    ksi = ksi - (W(ksi) * eps) / (W(ksi+eps) - W(ksi))
 
print(ksi, ' ',W(ksi),' ',y1(b))
Пояснение:
функция y1(x) - это аналитическое решение. Само условие выглядит так:
https://www.cyberforum.ru/cgi-bin/latex.cgi?y''-3y'+2y=xcosx
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.03.2017, 09:35
Ответы с готовыми решениями:

Решение краевой задачи
Добрый вечер, уважаемые форумчане! Прошу помощи с решением проблемы: необходимо решить волновое уравнение с помощью явной разнотстной схемы...

Метод стрельбы для решения краевой задачи
У меня такой вопрос. кто то знает как работает метод стрельбы для решения краевой задачи?

Конечно-разностный метод решения краевой задачи (дифференциального уравнения)
Решить краевую задачу конечно-разностным методом, условие в приложенных скриншотах и pdf-файле. Вместо правильного решения выводит...

19
Эксперт Python
 Аватар для dondublon
4651 / 2071 / 366
Регистрация: 17.03.2012
Сообщений: 10,179
Записей в блоге: 6
07.03.2017, 13:04
Цитата Сообщение от Jack Harckness Посмотреть сообщение
Приветствую! Не могу разобраться в языке (пишу первую программу). Реализую метод стрельбы для решения краевой задачи. По какой-то причине метод расходится.
Так с чем же всё-таки проблема - с языком или с тем, что метод расходится?
0
1 / 1 / 0
Регистрация: 27.04.2015
Сообщений: 17
07.03.2017, 13:19  [ТС]
Понимаете, проблема в том, что метод расходится, но он может не работать и из-за ошибок в коде.
0
Эксперт Python
 Аватар для dondublon
4651 / 2071 / 366
Регистрация: 17.03.2012
Сообщений: 10,179
Записей в блоге: 6
07.03.2017, 16:20
Ну, тогда только проверять и отлаживать.

Вообще можно чуть сократить. while i < int(n-1) заменить на for i in range(...).
numpy тут хорошо бы заюзать, но для этого желательно с самим питоном научиться работать.
0
1 / 1 / 0
Регистрация: 27.04.2015
Сообщений: 17
07.03.2017, 23:23  [ТС]
Спасибо за ответ! Отладка (spyder), к сожалению, ничего толкового мне не дала, и где-то стало возникать деление на ноль.. Я сюда, собственно и написал с целью узнать, в чем ошибка - в коде или в методе. Может быть есть другие алгоритмы применения метода?
0
Эксперт Python
 Аватар для dondublon
4651 / 2071 / 366
Регистрация: 17.03.2012
Сообщений: 10,179
Записей в блоге: 6
09.03.2017, 13:44
Тут надо разбираться, во-первых, в методе, во-вторых, в вашем коде.
Так что сорри.
Для отладки рекомендую PyCharm.
0
1 / 1 / 0
Регистрация: 27.04.2015
Сообщений: 17
09.03.2017, 13:45  [ТС]
Хотя бы, пожалуйста, посмотрите на синтаксис: может я в нем ошибся, так как это мой первый опыт.
0
Эксперт Python
 Аватар для dondublon
4651 / 2071 / 366
Регистрация: 17.03.2012
Сообщений: 10,179
Записей в блоге: 6
09.03.2017, 14:21
Замечания.
- про while и for уже сказал.
-
Цитата Сообщение от Jack Harckness Посмотреть сообщение
ksi = float(input('Input Ksi: '))
Этот инпут между двумя определениями функции, нелогично.
- Там же. Объявляете переменную ksi на уровне модуля - она будет видна в функции W. И такое же имя у параметра. Коллизия имён. Питон разрулит, но сами можете запутаться.

numpy тут был бы в тему, конечно.
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
09.03.2017, 20:51
Цитата Сообщение от Jack Harckness Посмотреть сообщение
Реализую метод стрельбы для решения краевой задачи
Слабо знаком с темой. Можно ссылку на алгоритм, который Вы пытаетесь реализовать?
0
112 / 112 / 16
Регистрация: 19.08.2013
Сообщений: 298
10.03.2017, 01:01
Jack Harckness, приведите хотя бы саму задачу. Где краевые условия?
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
10.03.2017, 02:30
Ошибка у Вас где-то в код вычисления нового ksi:
Python
1
2
while math.fabs(W(ksi)-y1(b)) > eps:
    ksi = ksi - (W(ksi) * eps) / (W(ksi+eps) - W(ksi))
Я не знаю какими могут быть значения ksi, поэтому взял от -1e6 до 1e6. Далее поиск методом деления пополам.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
min_ksi = -1000000.0
max_ksi = 1000000.0
 
while True:
    ksi = (min_ksi + max_ksi) / 2
    my_result = W(ksi)
    goal = y1(b)
    if math.fabs(my_result-goal) < eps:
        break
    if my_result > goal:
        min_ksi = ksi
    else:
        max_ksi = ksi
 
print(ksi, ' ',W(ksi),' ',y1(b))
Все сошлось
Code
1
-3.8370490074157715   9.558111190795898   9.557990450995279
1
1 / 1 / 0
Регистрация: 27.04.2015
Сообщений: 17
10.03.2017, 06:47  [ТС]
Ого! Спасибо! Я и не догадался бы, в чем проблема. Расчёт получается с точностью до 10 в -3 ?

Добавлено через 27 минут
А, насчёт алгоритма: очень много информации в интернете, и везде описано слабо. Нашёл более-менее подходящий: в ДУ второго порядка вводится замена z=y'. Получается система ДУ. Решается каким-либо методом ( у меня функция W(ksi) реализует метод Адамса первого порядка, он же - "метод Эйлера"), затем проверяется краевое условие, если решение с недостаточной точностью, то кси ищется снова и снова, до лучшего результата. Самое интересное это то, что именно такой метод нахождения кси встречался чаще всего.
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
10.03.2017, 13:08
Предлагаю проверить решение на очень-очень простой задаче (с известным/простым ответом). Выберите какое-нибудь и давайте пробежимся по нему от начала до конца: ОДУ, краевые условия, правильный ответ, результат программы. Программу проверим, заодно и с теорией краевых задач разберемся. Я лично пока только частично понимаю и условие, и решение, и алгоритм.

Добавлено через 25 минут
Интересные слайды
http://www.dms.uaf.edu/~bueler/twopoint.pdf

На английском
1
1 / 1 / 0
Регистрация: 27.04.2015
Сообщений: 17
10.03.2017, 14:41  [ТС]
vrm2, у меня по-вашему почему-то не сходится: считает все время одно и то же значение. С какой точностью вы считали, т.е. чему равно эпс?
Вывод консоли

А насчёт уравнения по-проще: можем взять "игрушечный" пример из слайдов, которые вы скинули
0
1 / 1 / 0
Регистрация: 27.04.2015
Сообщений: 17
12.03.2017, 07:44  [ТС]
vrm2, вы больше никаких изменений в коде программы не делали? Почему-то метод не сходится у меня. Пожалуйста, выложите весь код.
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
12.03.2017, 11:26
Лучший ответ Сообщение было отмечено Jack Harckness как решение

Решение

Цитата Сообщение от Jack Harckness Посмотреть сообщение
vrm2, вы больше никаких изменений в коде программы не делали? Почему-то метод не сходится у меня. Пожалуйста, выложите весь код.
Вы подбираете ksi, чтобы сравнялись W(ksi) и y1(b). Я всего лишь указал, что Ваш блок код, который подбирает ksi неверный. Он должен по чуть-чуть приближаться к целевому ksi, а на самом деле в какой-то момент "перепрыгивает" через него. Формулы выбора следующего ksi мне не ясны, поэтому я предложил подбирать ksi методом деления пополам.

Больше никаких изменений я не вносил. Ниже код. Только он так и остался неверный, т.е. не решает изначальную краевую задачу:
Кликните здесь для просмотра всего текста

Python
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
import math
from array import array
 
def y1(x):
    return math.e ** x + math.e ** (2 * x) + (0.1 * x - 0.12) * math.cos(x) - (0.3 * x + 0.34) * math.sin(x)
 
def g(x,y,z):
    return x * math.cos(x) + 3 * z - 2 * y
    
a,b = 0.0,1.0 
n = 10.0
eps = 0.001
 
def W(ksi):
    x=array('f')
    y=array('f')
    z=array('f')
 
    x.insert(0,a)
    y.insert(0,ksi)
    z.insert(0,2.76)
    i = 0
    h = (b - a) / n
    while i < int(n-1):
        x.append(x[i] + h)
        y.append(y[i] + h * z[i])
        z.append(z[i] + h * g(x[i],y[i],z[i]))
        i += 1    
    return y[int(n-1)]
 
 
min_ksi = -1000000.0
max_ksi = 1000000.0
 
while True:
    ksi = (min_ksi + max_ksi) / 2
    my_result = W(ksi)
    goal = y1(b)
    if math.fabs(my_result-goal) < eps:
        break
    if my_result > goal:
        min_ksi = ksi
    else:
        max_ksi = ksi
 
print(ksi, ' ',W(ksi),' ',y1(b))


Мне не хватает теории и в области ОДУ и в области численных методов, поэтому Ваш код понимаю только частично. И не могу сказать есть ли еще ошибки в коде.

А может вообще такой принцип решения краевой задачи неверен. Мне непонятны какие у Вас есть граничные условия в точках 0 и 1 (постановка задачи). Я не понимаю, правильно ли рассчитывается W(), зачем W(ksi) приближать к y1(b), почему в y1() в общем решении ОДУ приняты коэффициенты C1 и C2 равные 1. И т.д.

Также мне казалось, что метод заложенный в W() применим только к ОДУ первого порядка. И вообще, для решения краевых задач второго порядка надо разбивать задачу на несколько задач первого. Но, как и говорил, могу ошибаться.

Итого. Я предположил, что Вы возьмете некое уравнение второй степени (например, https://www.cyberforum.ru/cgi-bin/latex.cgi?y'' = x^4). Выложите логические выкладки преобразования уравнения к численному решению. Выложите код для решения этой задачи. И желательно ссылки на теорию, чтобы можно было понимать (повторить) Ваши действия. Это позволило бы и задачу простую решить (Вам), и теорию понять (мне, а может и Вам). И вместе бы написали код, решающий задачу.
1
1 / 1 / 0
Регистрация: 27.04.2015
Сообщений: 17
12.03.2017, 16:03  [ТС]
Цитата Сообщение от vrm2 Посмотреть сообщение
Формулы выбора следующего ksi мне не ясны, поэтому я предложил подбирать ksi методом деления пополам.
Идея выбора метода кси вытекает из метода Ньютона, она была такова:
https://www.cyberforum.ru/cgi-bin/latex.cgi?{\xi}_{n+1}={\xi}_{n}-\frac{W(\xi)}{W'(\xi)},
где https://www.cyberforum.ru/cgi-bin/latex.cgi?\xi - это ksi, https://www.cyberforum.ru/cgi-bin/latex.cgi?W'(\xi) - производная нашего численного решения. Т.к. W - не аналитическая, используем двухточечное определение производной:
https://www.cyberforum.ru/cgi-bin/latex.cgi?W'(\xi)=\frac{W(\xi+\varepsilon)-W(\xi)}{\varepsilon},
где https://www.cyberforum.ru/cgi-bin/latex.cgi?\varepsilon - это eps
В итоге получаем нашу формулу. Эта идея много где была описана, к тому же мне подсказывали использовать этот способ, но думаю мы с вами можем быть уверены, что метод сходится и по-вашему. Кстати, при увеличении числа n шагов (уменьшении eps) почему-то погрешность остается в третьем знаке после точки. Интересно, почему, ведь в цикле вычисления ksi, который вы предложили, явно указано условие окончание цикла - W(ksi) - y1(b) << eps.
Цитата Сообщение от vrm2 Посмотреть сообщение
Мне непонятны какие у Вас есть граничные условия в точках 0 и 1 (постановка задачи).
Краевые условия:
https://www.cyberforum.ru/cgi-bin/latex.cgi?y'(0)=z(0)=2.76<br />
y(1)=y(b)=9.557
В целом, они все указаны в теле программы. Сейчас у меня закралось сомнение, может быть я их неправильно указал?
Цитата Сообщение от vrm2 Посмотреть сообщение
Больше никаких изменений я не вносил. Ниже код. Только он так и остался неверный, т.е. не решает изначальную краевую задачу:
Возможно я ошибаюсь, но ведь y1(b) - это аналитическое решение в точке b, разве не к нему должно стремиться наше численное решение (т.е. W(ksi))?
Цитата Сообщение от vrm2 Посмотреть сообщение
Я не понимаю, правильно ли рассчитывается W(), зачем W(ksi) приближать к y1(b), почему в y1() в общем решении ОДУ приняты коэффициенты C1 и C2 равные 1.
Коэффициенты "взяты с потолка", т.к. задача состоит в том, чтобы написать рабочий алгоритм.
Цитата Сообщение от vrm2 Посмотреть сообщение
Также мне казалось, что метод заложенный в W() применим только к ОДУ первого порядка. И вообще, для решения краевых задач второго порядка надо разбивать задачу на несколько задач первого. Но, как и говорил, могу ошибаться.
Вы знаете, я, к сожалению, тоже плохо разбираюсь в теме, а та информация, которая есть про этот метод, не отвечает на многие вопросы и как-то сам алгоритм не всплывает.
Цитата Сообщение от vrm2 Посмотреть сообщение
Я предположил, что Вы возьмете некое уравнение второй степени (например, https://www.cyberforum.ru/cgi-bin/latex.cgi?y''={x}^{4}). Выложите логические выкладки преобразования уравнения к численному решению.
Хорошо, я попробую это реализовать.
Если у вас появятся еще какие-либо идеи/замечания, пожалуйста, сообщите.

Добавлено через 1 час 1 минуту
Итак, решить уравнение https://www.cyberforum.ru/cgi-bin/latex.cgi?y''={x}^{4}
Его аналитическим решением будет:
https://www.cyberforum.ru/cgi-bin/latex.cgi?y(x)={c}_{1}+{c}_{2}x+\frac{{x}^{6}}{30}
При https://www.cyberforum.ru/cgi-bin/latex.cgi?{c}_{1}, {c}_{2} равными 1, имеем частное решение:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\bar{y}(x)=1+x+\frac{{x}^{6}}{30}
Введем краевую задачу. Будем искать решение на промежутке 0..1 с краевыми условиями https://www.cyberforum.ru/cgi-bin/latex.cgi?\bar{y}'(0)=1, \bar{y}(1)=1.2.
1) Вернемся к нашему условию. Введем замену y'(x)=z(x), получаем систему дифференциальный уравнений:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\{\begin{eqnarray}y'(x) & = & z  \\z'(x) & = & {x}^{4}\\\end{eqnarray}
Обратите внимание, все уравнения первого порядка.
2) Решаем систему уравнений любым численным методом. Например, метод Адамса первого порядка (одношаговый, он же "метод Эйлера"): Сначала выбираем шаг. Затем берем (какое-то) начальное приближение https://www.cyberforum.ru/cgi-bin/latex.cgi?\xi, решаем исходя их него. Имея все н.у., а именно:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\{\begin{eqnarray}{x}_{0} & = & 0  \\{y}_{0} & = & \xi \\{z}_{0} & = & 1\end{eqnarray}
Решаем систему вида:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\{\begin{eqnarray}y'(x) & = & f(x)  \\z'(x) & = & g(x) \\\end{eqnarray}
По рекуррентному соотношению наши z' (для y' аналогично, только там вместо функции предыдущее значение z, умноженное на шаг):
https://www.cyberforum.ru/cgi-bin/latex.cgi?{z}_{i+1}={z}_{i}+h\bullet g({z}_{i})
https://www.cyberforum.ru/cgi-bin/latex.cgi?{y}_{i+1}={y}_{i}+h\bullet{z}_{i}
3) Проверяем, выполнено ли условие сходимости, если нет, выбираем другую кси (тут обычно применяется метод Ньютона), считаем снова и снова.

Добавлено через 8 минут
Забыл сказать, что это то, как я понял метод. Скорее всего что-то здесь не так, раз он не сходится.
1
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
12.03.2017, 21:21
Далее куча кода:

Кликните здесь для просмотра всего текста
Python
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
def newton_method(f, df, x0, eps):
    """Ищет решение f(x)=0 методом Ньютона
    
    f - функция от x, для которой ищем решение
    df - производная по x от f
    x0 - начальная точка
    eps - погрешность
    
    returns:
    x, для которого abs(f(x)) < eps
    """
    
    while True:
        delta = abs(f(x0))
        if delta < eps:
            return x0
        x0 = x0 - f(x0)/df(x0)
 
 
def shoot(fun_y2, y0, ksi, x0=0.0, x1=1.0, n=1000):
    """Рассчитывает один "выстрел" по методу стрельбы
    
    fun_y2 - вторая производная функции y
    y0 - y(x0)
    ksi - "угол выстрела", т.е. наклон касательной к y, т.е. y(x0)
    x0, x1 - диапазон x, на котором производится расчет
    n - количество блоков, на котороые разбивается диапазон (x0, x1) для расчета
    
    returns:
    конечное значение пули после выстрела, т.е. y(x1)
    
    """
    x = x0
    y = y0
    y1 = ksi
    
    delta = (x1 - x0) / n
    for i in range(n):
        x += delta
        y += delta * y1
        y1 += delta * fun_y2(x,y,y1)
    return y
 
 
def shooting_method(fun_ode, x0, y0, x1, y1, eps=1e-3):
    """Поиск решение ОДУ методом стрельбы
    
    fun_ode(x,y,y1) - p(x), в выражении если y''=p(x,y,y')
    (x0,y0) - начальная точка
    (x1,y1) - конечная точка
    1e-3 - погрешность
    
    return:
    угол стрельбы, y'(x0)
    """
    
    def F(ksi):
        return shoot(fun_ode, y0, ksi, x0, x1) - y1
    
    def dF(ksi):
        return F(ksi+eps) - F(ksi) / eps
    
    return newton_method(F, dF, x0, eps)


Как с этим работать:
Кликните здесь для просмотра всего текста
Python
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
# Проверка метода Ньютона. Решим уравнение x*x-100 = 0
newton_method(lambda x: x*x-100, lambda x: 2*x, 5, eps=1e-6)
# 10.00000000000001
 
 
 
# Проверка выстрела
 
def fun_y2(x, y, y1):
    return x**4
 
def fun_y1(x, c1):
    return x**5 / 5 + c1
 
# Для любых c1 и c2 не должен срабатывать assert
c1=1
c2=1
print("c1=", c1)
print("c2=", c2)
 
x0 = 0.0
x1 = 1.0
y0 = fun_y(x0, c1=c1, c2=c2)
y1 = fun_y(x1, c1=c1, c2=c2)
ksi = fun_y1(x0, c1)
 
calculated_y1 = shoot(fun_y2, y0, ksi)
print("y1=", y1)
print("расчетный y1=", calculated_y1)
assert abs(calculated_y1 - y1) < 1e-3, "разница должна быть мала для любых c1 и c2"
#c1= 1
#c2= 1
#y1= 2.033333333333333
#расчетный y1= 2.0333332500000516
 
 
 
# Проверка краевой задачи
def fun_ode(x, y, y1):
    return x**4
 
def fun_y1(x, c1):
    return x**5 / 5 + c1
 
def fun_y(x, c1, c2):
    return x**6 / 30 + c1 * x + c2
 
# Для любых c1 и c2 не должен срабатывать assert
c1=1
c2=1
print("c1=", c1)
print("c2=", c2)
 
x0 = 0.0
x1 = 1.0
y0 = fun_y(x0, c1=c1, c2=c2)
y1 = fun_y(x1, c1=c1, c2=c2)
ksi = fun_y1(x0, c1)
 
calculated_ksi = shooting_method(fun_ode, x0, y0, x1, y1)
print("ksi=", ksi)
print("расчетный ksi=", calculated_ksi)
assert abs(calculated_ksi - ksi) < 1e-3, "разница должна быть мала для любых c1 и c2"
 
#c1= 1
#c2= 1
#ksi= 1.0
#расчетный ksi= 0.9999925196666988


Добавлено через 1 минуту
Вернулся к Вашему методу Ньютона. Т.к. бисекция работает неверно (у меня), гнадо исправлять. К тому же метод Ньютона быстрее сходится
1
1 / 1 / 0
Регистрация: 27.04.2015
Сообщений: 17
12.03.2017, 21:37  [ТС]
Возможно удивительно, но метод бисекции из вашего поста довольно быстро и точно сошелся для условий, приведенных в первом посте! Все сработало! Но по какой-то причине тот же программный код не работает для вашего примера y''=x^4. Может я где-то ошибся в своих выкладках?
А насчёт вашего кода: я немного запутался, не совсем понимаю что он делает. Что означает "Ищет решение f(x)=0 методом Ньютона"? Что такое f(x)?
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
12.03.2017, 22:57
Цитата Сообщение от Jack Harckness Посмотреть сообщение
Что такое f(x)?
f - функция от x. Например:
Python
1
2
def f(x):
    return x**2
В питоне функции могут принимать другие функции. И переданные функции можно вызывать
Python
1
2
3
4
def calculate(myfun, myarg):
    return myfun(myarg)
 
calculate(f, 3)  # результат 9
А еще в питоне есть лямбды - это безымянные функции. Т.е. можно определить функцию без def и сразу передать ее в качестве параметра. Пример, аналогичный выше:
Python
1
calculate(lambda x: x**2, 3) # результат 9
Добавлено через 2 минуты
А вот "правильный" метод деления пополам. Учитываются знаки функций:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def different_sign(x, y):
    return x * y < 0
 
def bisection(f, left, right, eps=1e-6):
    """Ищет x, такой что f(x)=0
    
    f - функция f(x)
    left, right - диапазон x, в котором ищется корень
    f(left) и f(right) должны иметь разные знаки
    eps - погрешность
    
    return:
    x - f(x)=0
    """
    assert different_sign(f(left), f(right))
    while True:
        x = (left + right) / 2
        my_result = f(x)
        if abs(my_result) < eps:
            return x
        if different_sign(my_result, f(left)):
            right = x
        else:
            left = x
Добавлено через 6 минут
Теперь подгонка ksi будет выглядеть так:

Ищем W(ksi) = y1(b), т.е. ищем корень уравнения W(ksi) - y1(b) = 0.
Определяем функцию и передаем ее в bisection (+диапазон)

Python
1
2
3
4
def myfun(ksi):
    return W(ksi) - y1(b)
 
bisection(myfun, left=-1000000.0, right=1000000.0, eps=1e-6):
Добавлено через 4 минуты
Надеюсь не запутал еще больше

Добавлено через 17 минут
Похоже, все что Вам нужно, есть в scipy (что не удивительно).
Ньютон https://docs.scipy.org/doc/sci... ewton.html
Бисекция https://docs.scipy.org/doc/sci... isect.html
Краевая задача https://docs.scipy.org/doc/sci... e_bvp.html

Но это если Вам таких задач надо решать много, быстро и правильно. Но с передачей функций в качестве параметров Вам придется разобраться.

Но я не против обсудить код и задачу. Благодаря Вашим выкладкам и коду, а также написанному мной коду, у меня что-то стало проясняться.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.03.2017, 22:57
Помогаю со студенческими работами здесь

Решение краевой задачи методом стрельбы
Здравствуйте! есть необходимость в реализации метода стрельбы. Не могли бы вы проверить его. Есть две проблемы. При задании шага &lt;...

Решение краевой задачи методом стрельбы
Помогите решить, пожалуйста, задачу в maple: Решить краевую задачу с заданными «краями»:

Решение краевой задачи методом стрельбы
Доброго времени суток. Дано неоднородное нелинейное ДУ второго порядка, граничные условия второго порядка и отрезок (пределы для x) ...

Метод прогонки в неявной схеме для решения краевой задачи уравнения теплопроводности
Здравствуйте! У меня есть начальное условие к уравнению теплопроводности и два краевых условия: {u}_{0}^{n}=0 и {u}_{M}^{n}=3. Для...

Написать решение краевой задачи методом стрельбы
Всем привет! Помогите пожалуйста написать решение краевой задачи методом стрельбы. Все данные приложены в файле ниже(вариант 18), если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru