Я сделал это для решения функции BVP с использованием метода съемки.
Я не понимаю, почему, когда мой размер шага h = 0,1, предел x_end выходит за пределы того, что я установил в Цикл while под функциейsolve_ivp.
Когда я установил x_end = 1 и h = 0,1 в цикле while
x = 0
y = np.array(y0)
solution = [(x, y.copy())]
while x < x_end:
y = runge_kutta_4(f, x, y, h, p, q, r)
x += h
print(x)
solution.append((x, y.copy()))
Я получаю следующие итерации x внутри цикла while:
0.1
0.2
0.30000000000000004
0.4
0,5
0,6
0,7
0,79999999999999999
0.8999999999999999
0.9999999999999999
1.0999999999999999
Другие значения h не вызывают такой проблемы.
Может кто-нибудь объяснить почему и как я могу это исправить?
Ниже приведен мой полный код, если это поможет.
Я сделал это для решения функции BVP с использованием метода съемки. Я не понимаю, почему, когда мой размер шага h = 0,1, предел x_end выходит за пределы того, что я установил в Цикл while под функциейsolve_ivp. Когда я установил x_end = 1 и h = 0,1 в цикле while [code]x = 0 y = np.array(y0) solution = [(x, y.copy())]
while x < x_end: y = runge_kutta_4(f, x, y, h, p, q, r) x += h print(x) solution.append((x, y.copy())) [/code] Я получаю следующие итерации x внутри цикла while: 0.1 0.2 0.30000000000000004 0.4 0,5 0,6 0,7 0,79999999999999999 0.8999999999999999 0.9999999999999999 1.0999999999999999 Другие значения h не вызывают такой проблемы. Может кто-нибудь объяснить почему и как я могу это исправить? Ниже приведен мой полный код, если это поможет. [code]import numpy as np import matplotlib.pyplot as plt
# Define the ODE as a system of first-order equations def ode_system(x, y, p, q, r): """ Converts the second-order ODE into a system of two first-order ODEs. y = [y1, y2], where y1 = y and y2 = y'. """ y1, y2 = y dy1_dx = y2 dy2_dx = -p(x) * y2 - q(x) * y1 + r(x) return np.array([dy1_dx, dy2_dx])
def runge_kutta_4(f, x0, y0, h, p, q, r): """ Fourth-order Runge-Kutta method for solving the system of ODEs. """ k1 = h * f(x0, y0, p, q, r) k2 = h * f(x0 + h / 2, y0 + k1 / 2, p, q, r) k3 = h * f(x0 + h / 2, y0 + k2 / 2, p, q, r) k4 = h * f(x0 + h, y0 + k3, p, q, r) return y0 + (k1 + 2 * k2 + 2 * k3 + k4) / 6
def solve_ivp(f, x_range, y0, h, p, q, r): """ Solves the initial value problem using the RK4 method. """ x0, x_end = x_range x = x0 y = np.array(y0) solution = [(x, y.copy())]
while x < x_end: y = runge_kutta_4(f, x, y, h, p, q, r) x += h solution.append((x, y.copy()))
return solution
def shooting_method(a, b, alpha1, beta1, gamma1, alpha2, beta2, gamma2, p, q, r, h, tol=1e-6): """ Solves the boundary value problem using the shooting method. - a, b: Interval [a, b] - alpha1, beta1, gamma1: Boundary condition at x=a (third kind) - alpha2, beta2, gamma2: Boundary condition at x=b (third kind) - p, q, r: Coefficients in the ODE - h: Step size - tol: Tolerance for root finding """
# Solve the BVP h = 0.1 # Step size solution = shooting_method(a, b, alpha1, beta1, gamma1, alpha2, beta2, gamma2, p, q, r, h)
# Extract the solution x_vals = [x for x, y in solution] y_vals = [y[0] for x, y in solution]
# Plot the solution plt.plot(x_vals, y_vals, label="y(x)") plt.xlabel("x") plt.ylabel("y(x)") plt.title("Solution of the BVP using Shooting Method") plt.legend() plt.grid() plt.show() [/code] Я попробовал изменить размер шага h, ошибок не обнаружено.
Я пытаюсь использовать функцию возврата, чтобы выйти из бесконечного цикла While True с помощью try: и кроме: в нем. Мое понимание где-то должно быть ошибочным, но я думаю, что return z должен разорвать цикл и вернуть значение основной функции,...
В конце этого недавнего видео Ник Чапсас прокомментировал, что метод Find в List был «неоптимизирован», поскольку код не выполняет итерацию по диапазону массива, а на самом массиве:
public T? Find(Predicate match) {
if (match == null) {...
В конце этого недавнего видео Ник Чапсас прокомментировал, что метод Find в List был «неоптимизирован», поскольку код не выполняет итерацию по диапазону массива, а на самом массиве:
public T? Find(Predicate match) {
if (match == null) {...
Я написал действительно простой код, который функционирует как «школьный регистр», спрашивая, присутствует ли ученик или нет; Если что -то другое, кроме «да» или «нет», введено, код просто напечатает «неверный ввод».
Я хотел бы иметь ответ «да» или...
Работа над курсом Java MOOC. Почему while(end > Begin) не сработало, а while(begin под методомbinarySearch
Ссылка на мой код: нажмите здесь
Для моей первоначальной отправки while(end > Begin) не сработало (там проверяли ошибки при отправке), но...