1112 Как вы говорите, часть метода Ньютона работает так, как задумано. Проблема с вашей частью заговора.
В вашей реализации вы генерируете 1 график за итерацию в цикле for. Это приводит к 20 участкам с 1 очком за участок, что не является желаемым результатом.
Ниже приведен код для генерации 1 сюжета с 21 точкой.
f = @(x) (x).^2 - 10;
f_deriv = @(x) 2*x;
x0 = 1;
x_true = sqrt(10);
x_save = (x0);
for jj = 1:20
% Don't plot here. Wait until all data is collected.
x_new = x0 - f(x0)/f_deriv(x0);
x_save(1+jj,1) = x_new;
x0 = x_new;
end
% Plot here. All data has been collected.
plot(0:20',abs(x_save-x_true),'kx');
xlim([0 20]);
ylim([0 2.5]);
xticks(0:20);
yticks(0:0.1:2.5);
РЕДАКТИРОВАТЬ: для решения проблемы пропущенных точек с помощью semilogy
вместо plot
.
semilogy
вычисляет лог значений. log(0) = -Inf
Ниже приведен пример изменения координат, чтобы избежать вычитания двух больших чисел.
% Original problem parameters
x0 = 1;
x_true = sqrt(10);
% Change of co-ordinates
% u = x - sqrt(10);
% f(x) = g(u(x))
g = @(u) u^2 + 2*x_true*u;
g_deriv = @(u) 2*u + 2*x_true;
u0 = x0 - x_true;
u_save = u0;
for jj = 1:20
u_new = u0 - g(u0)/g_deriv(u0);
u_save = [u_save u_new];
u0 = u_new;
end
semilogy(0:20, abs(u_save - 0), 'kx')
xlim([0 20]);
Вы заметите, что точки за 6 итераций по-прежнему исчезают, потому что ошибка все еще меньше точности машины (~ 1e-15). Однако ошибка снова не увеличивается.
Если вы хотите повысить точность своих вычислений, вы можете обратиться к функции vpa
.
https://www.mathworks.com/help/symbolic/increase-precision-of-numeric-calculations.html
Не изобретайте велосипед; используйте Lutz Roeder Отражатель.NET .
Разве Вы не можете сделать этого с Отражатель ?
можно загрузить блок и просмотреть его как VB.net/C#/IL...
Давайте посмотрим, удается ли мне вложить его сначала: Отражатель.NET ! Это действительно должно быть FAQ...
Нет никакого инструмента в BCL, который сделает это; однако, существует большой инструмент, названный Отражатель , для которого можно записать собственные дополнения. Таким образом, Вы могли прочертовское использование это для получения данных, Вы хотите.
Необходимо просто использовать Отражатель.NET , если у Вас есть блок. Также попробуйте генерал файла дополнение.
Отражатель делает это. Возможно, Вы могли использовать Отражатель против Отражателя и изучить, как он решает проблему.
Вы могли бы также сказать, почему Вы хотите сделать это - может быть лучшее решение Вашей полной проблемы.
Позвольте мне быть первым, чтобы предложить, чтобы Вы захватили копию Отражателя Красного Логического элемента.
Возможно, вам стоит попробовать Dis#, если вы не хотите заново изобретать колесо... Это почти лучший инструмент для преобразования кода. NetDASM имеет инструмент, который позволяет конвертировать C# в IL. возможно, вам стоит взглянуть на него.
Изобретая колесо, несомненно, лучший способ учиться! вам нужно будет создать свой собственный класс, который бы конвертировал iL в C #. Это требует знания промежуточного языка.
Я полагаю, вы уже преобразовали байтовый массив в инструкции IL, как мы видим в ildasm.exe, используя Reflection.Emit.OpCodes, OpCode.OperandType, BitConvertor.ReadByte (), BitConvertor.ReadInt32 и т. Д.
Если вы хотите сделать это самостоятельно, вы можете начать со старого Cecil.Decompiler и улучшить его, см. исходный код и старый пост Jb. Evain объявляет о проекте (Ссылка вниз).