#java
#java
Вопрос:
У меня есть вопрос, который нужно решить, используя Java-полиномы. Я настроил весь свой код, и, похоже, все в порядке, но с помощью моего составного метода я получаю результат, отличный от ожидаемого.
class Polyonmial
{
final static private int mantissa=52;
final static private double epsilon=Math.pow(2.0,-mantissa);
private double coefficient=0.0;
private int power=0;
private Polynomial successor=null;
public Polynomial(double coefficient, int power)
{
if (Double.isNaN(coefficient)) return;
if (Math.abs(coefficient)<epsilon) return;
if (power<0) return;
this.coefficient=coefficient;
this.power=power;
}
final public double coefficient(int power)
{
if (power<0) return 0.0;
Polynomial traverser=this;
do
{
if (traverser.power<power) return 0.0;
if (traverser.power==power) return traverser.coefficient;
traverser=traverser.successor;
}
while (traverser!=null);
return 0.0;
}
final public Polynomial composite(Polynomial that)
{
if (that==null) return null;
Polynomial thisClone = this.clone();
Polynomial thatClone = that.clone();
Polynomial temp = new Polynomial(0.0,0);
Polynomial result = new Polynomial(0.0,0);
while(thisClone != null)
{
if (thisClone.power == 0)
{
temp.coefficient = 1.0;
temp.power = 0;
}
else
{
if (thisClone.power == 1)
temp = thatClone;
}
//System.out.println("temp:" temp);
while(temp != null)
{
temp.coefficient = thisClone.coefficient*temp.coefficient;
result = result.plus(temp);
temp = temp.successor;
}
temp = new Polynomial(0.0,0);
thisClone=thisClone.successor;
}
return resu<
}
final public Polynomial[] dividedBy(Polynomial that)
{
if (that==null) return null;
if (that.coefficient==0.0) return null;
Polynomial quotient=new Polynomial(0.0,0);
Polynomial remainder=this.clone();
Polynomial traverser = this.clone();
Polynomial resultoftemp = new Polynomial(0.0, 0);
Polynomial temp = new Polynomial(0.0, 0);
double thiscoffe = this.coefficient(this.degree());
double thatcoffe = that.coefficient(that.degree());
if(that.coefficient !=0 amp;amp; that.power !=0)
{
quotient.coefficient = thatcoffe / thiscoffe;
quotient.power = that.power - this.power;
}
while(traverser !=null)
{
temp.power = quotient.power traverser.power;
temp.coefficient = quotient.coefficient * traverser.coefficient;
traverser=traverser.successor;
resultoftemp = resultoftemp.plus(temp);
remainder = that.minus(resultoftemp);
}
Polynomial[] result=new Polynomial[2];
result[0]=quotient;
result[1]=remainder;
return resu<
}
final public Polynomial integrate()
{
if (this.coefficient==0.0) return new Polynomial(0.0,0);
Polynomial result=this.clone();
Polynomial temp = new Polynomial(0.0, 0);
Polynomial rstemp = new Polynomial(0.0, 0);
while(result!=null)
{
rstemp.power = result.power 1;
rstemp.coefficient = result.coefficient / (result.power 1);
result = result.successor;
temp = temp.plus(rstemp);
}
return resu<
}
final public Polynomial minus(Polynomial that)
{
if (that==null) return null;
if (this.equals(that)) return new Polynomial(0.0,0);
Polynomial result=this.clone();
if (that.coefficient==0.0) return resu<
Polynomial traverser=that;
do
{
add(result,-traverser.coefficient,traverser.power);
traverser=traverser.successor;
}
while (traverser!=null);
return resu<
}
final public int powerMax()
{
int max=Integer.MIN_VALUE;
Polynomial traverser=this;
do
{
if (max<traverser.power) max=traverser.power;
traverser=traverser.successor;
}
while (traverser!=null);
return max;
}
final public int powerMin()
{
int min=Integer.MAX_VALUE;
Polynomial traverser=this;
do
{
if (min>traverser.power) min=traverser.power;
traverser=traverser.successor;
}
while (traverser!=null);
return min;
}
}
В моем ожидаемом выходном файле я должен получить это:
(-1.0*X^1 1.0).composite(-1.0*X^1 1.0)=
1.0*X^1
Но вместо этого я получаю:
(-1.0*X^1 1.0).composite(-1.0*X^1 1.0)=
1.0*X^1 1.0
Мы высоко ценим любые советы или помощь.
Комментарии:
1. Вы пробовали запускать свой первый пример ((-1.0 * X ^ 1 1.0).composite(-1.0 * X ^ 1 1.0)) через отладчик? Этот пример кажется довольно простым, и его стоит рассмотреть. Кажется довольно странным, что -1.0 1.0 не происходит.
2. @ccoakley Я предполагаю, что это проблема с составным методом
3. @Bill: Хорошо, именно туда я впервые заглянул и обнаружил единственную очевидную ошибку. Если я что-то неправильно истолковал, пожалуйста, дайте мне знать.
4. @Билл, пожалуйста, не стирайте свой вопрос, когда найдете ответ. Этот сайт работает не так.
5. lol, «исправлено (пожалуйста, удалите)»? Вы понимали, что один из пунктов сайта вопросов и ответов заключается в том, что в большинстве случаев ваш вопрос уже был задан кем-то другим, поэтому вы можете выполнить поиск по нему в базе данных? Вопросы и ответы принадлежат сообществу, вам не следует удалять его, если вы решили СВОЮ проблему.
Ответ №1:
Я немного изменил ваш составной метод таким образом (логически эквивалентно, перемещения фигурных скобок и добавления println):
final public Polynomial composite(Polynomial that) {
if (that==null) return null;
Polynomial thisClone = this.clone();
Polynomial thatClone = that.clone();
Polynomial temp = new Polynomial(0.0,0);
Polynomial result = new Polynomial(0.0,0);
while(thisClone != null) {
System.out.println("composite with term degree: " thisClone.power);
if (thisClone.power == 0) {
temp.coefficient = 1.0;
temp.power = 0;
} else if (thisClone.power == 1) {
temp = thatClone;
} else {
for(int i=2; i<=thisClone.power; i ) {
temp = temp.plus(thatClone.times(thatClone));
}
}
System.out.println("temp heading in: " temp);
while(temp != null) {
temp.coefficient = thisClone.coefficient*temp.coefficient;
result = result.plus(temp);
temp = temp.successor;
}
System.out.println("result so far: " result);
temp = new Polynomial(0.0,0);
thisClone=thisClone.successor;
}
return resu<
}
и для примера (-1.0*X^1 1.0).composite(-1.0*X^1 1.0)
, это вывод:
составной со степенью термина: 1
ввод временного значения: -1.0 * X ^ 1 1.0
результат на данный момент: 1.0 * X ^ 1
составной со степенью термина: 0
ввод временного значения: 1.0
результат на данный момент: 1.0 * X ^ 1 1.0
Правильно ли я полагаю, что первый «результат на данный момент» должен быть «-1.0 * X ^ 1-1.0»?
Если это так, давайте рассмотрим цикл:
while(temp != null) {
temp.coefficient = thisClone.coefficient*temp.coefficient;
result = result.plus(temp);
temp = temp.successor;
}
Я думаю, что это ваша проблема: result = result.plus(temp)
добавляет не только «текущий термин» к temp, но и термин-преемник. Но затем вы зацикливаетесь на temp, устанавливая его равным его преемнику, и делаете это снова!
Я думаю, что решение примерно такое (сначала вычислите все временные термины, затем обновите результат):
Polynomial looptemp = temp;
while(looptemp != null) {
looptemp.coefficient = thisClone.coefficient*looptemp.coefficient;
looptemp = looptemp.successor;
}
result = result.plus(temp);
По крайней мере, это работает для единственного примера, который я пробовал.
Комментарии:
1. @Bill: Выполняется ли сбой для любого примера со степенью меньше 2? Мне также показалось, что ваш
temp = temp.plus(thatClone.times(thatClone));
выглядел немного подозрительно, но я не пробовал пример, в котором использовался этот код. К сожалению, мне пора спать. Удачи!2. @Bill: Просто предложение по отладке: еще больше упростите свой тестовый пример. Попробуйте использовать только два термина (для выполнения преемника) и один термин (на случай, если нет проблемы с преемником). Нет веских причин (пока) для тестирования с тремя терминами. Я ожидаю, что если ошибка существует, ее можно использовать с двумя терминами, и, надеюсь, не только с одним. Отрицательные коэффициенты хороши, но сделайте их другими (игнорируя знак, у вас есть 3 коэффициента 1.0 в вашем тестовом примере). Прокомментируйте еще раз, и я проверю, когда вернусь домой с работы. Еще раз, удачи!