Дискуссионный математический форумМатематический форум
Математический форум Math Help Planet

Обсуждение и решение задач по математике, физике, химии, экономике

Теоретический раздел
Часовой пояс: UTC + 3 часа [ Летнее время ]
новый онлайн-сервис
число, сумма и дата прописью

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Численное дифференцирование
СообщениеДобавлено: 11 июн 2018, 13:36 
Не в сети
Начинающий
Зарегистрирован:
01 июн 2018, 22:34
Сообщений: 6
Cпасибо сказано: 3
Спасибо получено:
0 раз в 0 сообщении
Очков репутации: 1

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

уже несколько дней не могу найти ошибку. массив xi[] - это узловые точки, h - расстояние между узловыми точками. значение производной вычисляется сразу для трех точек, которые задаются через x[].

▼ Код программы
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;

public class Main {
public static final double h = 0.0139941;
public static final double[] xi = {9.32006951, 9.33406361, 9.34805771, 9.36205181, 9.37604591, 9.39004001};

public static void main(String[] args) {

Scanner in = new Scanner(System.in);
int i;

System.out.println("Введите три значения x");
//double[] x = {in.nextDouble(), in.nextDouble(), in.nextDouble()};
double[] x = {9.32706656, 9.34106066, 9.35505476};
//double[] x = {9.33, 9.34, 9.35};

System.out.println("Численное дифференцирование");

System.out.printf("x | y' | dP1 | abs(y' - dP1) | x~ \n");
for (i = 0; i < 3; i++)
System.out.printf("%.10f | %.10f | %.10f | %.14f | %.10f \n", x[i], getdY(x[i]), getdP1(x[i]), Math.abs(getdY(x[i]) - getdP1(x[i])), getClosest(x[i], 1));
System.out.printf("x | y' | dP2 | abs(y' - dP2) | x~ \n");
for (i = 0; i < 3; i++)
System.out.printf("%.10f | %.10f | %.10f | %.14f | %.10f \n", x[i], getdY(x[i]), getdP2(x[i]), Math.abs(getdY(x[i]) - getdP2(x[i])), getClosest(x[i], 2));
}

static double getClosest(double x, int k) {
BigDecimal min = new BigDecimal(xi[0]).setScale(9, RoundingMode.HALF_UP);
BigDecimal x_ = new BigDecimal(x).setScale(9, RoundingMode.HALF_UP);
BigDecimal xa;
for (int i = 1; i < 6; i++) {
xa = new BigDecimal(xi[i]).setScale(9, RoundingMode.HALF_UP);
if ((xa.add(x_.negate()).abs().compareTo(min.add(x_.negate()).abs()) == -1) || ((xa.add(x_.negate())).abs().compareTo(min.add(x_.negate()).abs()) == 0 && k == 2))
min = xa;
}
return min.doubleValue();
}

static double getY(double x) {
return 2 * Math.cos((5 * x - 3) / 7);
}

static double getdY(double x) {
return -10.0 / 7.0 * Math.sin((5 * x - 3) / 7.0);
}

static double getdP1(double x) {
double q = (x - getClosest(x, 1)) / h;
return (1.0 / h) * (0.0009905 + (2 * q - 1) / 2.0 * (-0.00019963) + (3 * q * q - 6 * q + 2) / 6.0 * (-0.00000008) + (4 * q * q * q - 18 * q * q + 22 * q - 6) / 24.0 * 0.00000002);
}

static double getdP2(double x) {
double t = (x - getClosest(x, 2)) / h;
return 1.0 / h * (0.00019158 + (2 * t + 1) / 2.0 * (-0.00019981) + (3 * t * t + 6 * t + 2) / 6.0 * (-0.00000004) + (4 * t * t * t + 18 * t * t + 22 * t + 6) / 24.0 * 0.00000002);
}
}

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Численное дифференцирование
СообщениеДобавлено: 11 июн 2018, 14:18 
Не в сети
Начинающий
Зарегистрирован:
01 июн 2018, 22:34
Сообщений: 6
Cпасибо сказано: 3
Спасибо получено:
0 раз в 0 сообщении
Очков репутации: 1

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

Вернуться к началу
 Профиль  
Cпасибо сказано 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему      Страница 1 из 1 [ Сообщений: 2 ]

 Похожие темы   Автор   Ответы   Просмотры   Последнее сообщение 
Численное дифференцирование

в форуме Численные методы

makmokk

1

78

21 ноя 2023, 16:27

Численное дифференцирование

в форуме Численные методы

Makarel

4

479

21 май 2018, 02:52

Численное дифференцирование

в форуме Дифференциальное исчисление

adsarc

5

543

19 фев 2015, 20:04

Численное дифференцирование функций

в форуме Численные методы

Evgeshagesha

0

584

02 ноя 2015, 10:07

Численное дифференцирование. Метод Гаусса

в форуме Численные методы

Makarel

3

530

24 май 2018, 05:02

Численное дифференцирование по формулам Ньютона и Гаусса

в форуме Численные методы

Vestail

0

425

25 май 2015, 21:07

Численное интегрирование

в форуме Численные методы

Aleksadr_UA

0

458

29 апр 2014, 15:21

Численное интегрирование

в форуме Численные методы

dobro

2

249

04 июн 2018, 15:48

Численное интегрирование функций

в форуме Численные методы

Evgeshagesha

1

538

02 ноя 2015, 09:41

Численное решение ДУ на полуоси

в форуме Численные методы

geor

0

270

17 апр 2015, 04:53


Часовой пояс: UTC + 3 часа [ Летнее время ]



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Яндекс.Метрика

Copyright © 2010-2023 MathHelpPlanet.com. All rights reserved