利用c#实现磁偶极子定位时,采用梯度下降法,优化后的磁偶极子的位置和磁距竟然与设置的初始值是一样的,但是不对啊,优化的结果应该跟初值没关系才对,附完整代码,求助问题出在哪

我观此物与我有缘 2024-11-25 16:19:38

using System;

//基于梯度下降法的磁偶极子定位算法——完整

class Complete_Magnetic_Dipole_Localization_Algorithm
{
    // 真空磁导率
    const double Mu0 = 4 * Math.PI * 1e-7;
    // 假设观测到的磁场——已知


    // 计算磁场

    static double[][] ComputeMagneticField(double[][] sensorPositions, double[] dipolePosition, double[] dipoleMoment)
    {
        int numSensors = sensorPositions.Length;
        double[][] magneticFields = new double[numSensors][];
        for (int i = 0; i < numSensors; i++)
        {
            // 获取传感器位置
            double[] sensorPosition = sensorPositions[i];
            double[] r = new double[3];
            for (int j = 0; j < 3; j++)
            {
                r[j] = sensorPosition[j] - dipolePosition[j];
            }
            //计算r的平方和
            double rSquared = 0;
            for (int j = 0; j < 3; j++)
            {
                rSquared += r[j] * r[j];
            }
            //计算r的三次方
            double rCubed = Math.Pow(rSquared, 1.5);
            //计算磁距与向量的点积
            double dotProduct = 0;

            for (int j = 0; j < 3; j++)
            {
                dotProduct += dipoleMoment[j] * r[j]; // 计算磁矩与位置向量的点积
            }
            //计算磁场
            double[] magneticField = new double[3];
            for (int j = 0; j < 3; j++)
            {
                magneticField[j] = (Mu0 / (4 * Math.PI)) * ((3 * dotProduct * r[j]) / rCubed - dipoleMoment[j] / (rSquared * Math.Sqrt(rSquared)));
            }
            // 存储每个传感器位置的磁场
            magneticFields[i] = magneticField;
        }

        return magneticFields; //计算B
    }

    // 计算磁场与观测磁场之间的误差(损失函数)
    static double ComputeLoss(double[][] sensorPositions, double[][] observedFields, double[] initialdipolePosition, double[] initialdipoleMoment)
    {
        double loss = 0;
        for (int i = 0; i < sensorPositions.Length; i++)//for (int i = 0; i < sensorPositions.Length; i++)
        {
            double[] predictedField = ComputeMagneticField(new double[][] { sensorPositions[i] }, initialdipolePosition, initialdipoleMoment)[0];
            for (int j = 0; j < 3; j++)
            {
               
                loss += Math.Pow(predictedField[j] - observedFields[i][j], 2);
            }

        }
        return loss;
    }

    //坐标变换
    public static double[][] TransformCoordinates(double[][] positions, int originIndex)
    {
        double[][] transformedPositions = new double[positions.Length][];
        double[] origin = positions[originIndex]; // 选择某个传感器作为原点

        for (int i = 0; i < positions.Length; i++)
        {
            transformedPositions[i] = new double[3];
            for (int j = 0; j < 3; j++)
            {
                transformedPositions[i][j] = positions[i][j] - origin[j]; // 相对原点进行坐标变换
            }
        }

        return transformedPositions;
    }


    // 计算磁偶极子位置的梯度
    static double[] ComputeGradientWithRespectToPosition(double[][] sensorPositions, double[][] observedFields, double[] initialdipolePosition, double[] initialdipoleMoment)
    {
        double[] gradient = new double[3];
        double epsilon = 1e-6;
        for (int i = 0; i < 3; i++)
        {
            double[] perturbedPosition = (double[])initialdipolePosition.Clone();  // 复制当前的位置
            perturbedPosition[i] += epsilon;  // 在第i个方向上加上一个小扰动(epsilon)

         
            double lossPlus = ComputeLoss(sensorPositions, observedFields, perturbedPosition, initialdipoleMoment);

          
            double lossMinus = ComputeLoss(sensorPositions, observedFields, initialdipolePosition, initialdipoleMoment);

          
            gradient[i] = (lossPlus - lossMinus) / epsilon;
        }
        return gradient;
    }

    // 计算磁偶极矩的梯度
    static double[] ComputeGradientWithRespectToMoment(double[][] sensorPositions, double[][] observedFields, double[] initialdipolePosition, double[] initialdipoleMoment)
    {
        double[] gradient = new double[3];
        double epsilon = 1e-6;

        for (int i = 0; i < 3; i++)
        {
            double[] perturbedMoment = (double[])initialdipoleMoment.Clone();
            perturbedMoment[i] += epsilon;

            double lossPlus = ComputeLoss(sensorPositions, observedFields, initialdipolePosition, perturbedMoment);
            double lossMinus = ComputeLoss(sensorPositions, observedFields, initialdipolePosition, initialdipoleMoment);

            gradient[i] = (lossPlus - lossMinus) / epsilon;
        }
        return gradient;
    }

    // 梯度下降算法优化磁偶极子的位置和磁矩
    static (double[], double[]) GradientDescentOptimization(double[][] sensorPositions, double[] initialdipolePosition, double[] initialdipoleMoment, double[][] observedFields, double learningRate, int iterations)
    {
        //double tolerance = 1e-6;
        for (int iter = 0; iter < iterations; iter++)
        {
            // 计算损失
            double loss = ComputeLoss(sensorPositions, observedFields, initialdipolePosition, initialdipoleMoment);
           
            double[] positionGradient = ComputeGradientWithRespectToPosition(sensorPositions, observedFields, initialdipolePosition, initialdipoleMoment);
            double[] momentGradient = ComputeGradientWithRespectToMoment(sensorPositions, observedFields, initialdipolePosition, initialdipoleMoment);

           
            double decay = Math.Pow(0.9, iter / 100);  // 每100次迭代减小10%
            double initialLearningRate = learningRate;
            double adjustedLearningRate = initialLearningRate * decay;
            for (int i = 0; i < 3; i++)
            {
                initialdipolePosition[i] -= adjustedLearningRate * positionGradient[i];
                initialdipoleMoment[i] -= adjustedLearningRate * momentGradient[i];
            }
            // 每100次输出一次损失值
            if (iter % 100 == 0)
            {
                Console.WriteLine($"Iteration {iter}, Loss: {loss}");
            }
        }
        return (initialdipolePosition, initialdipoleMoment);
    }

    public static void Main(string[] args)
    {

        double[][] sensorPositions =
        {
            
            new double[] { 1.0, 2.0, 3.0 },
            new double[] { 2.0, 3.0, 4.0 },
            new double[] { 3.0, 4.0, 5.0 },
        };


        double[] dipolePosition = new double[] { 2.0, 2.0, 2.0 };
        double[] dipoleMoment = new double[] { 2.0, 2.0, 3.0 };

        double[][] observedFields = ComputeMagneticField(sensorPositions, dipolePosition, dipoleMoment);


        double learningRate = 1e-4;
        int iterations = 1000;//迭代次数超过40会导致损失值变大
        double[] initialdipolePosition = new double[] { 1.0, 1.0, 1.0 };
        double[] initialdipoleMoment = new double[] { 1.0, 1.0, 1.0 };

        var (optimizedPosition, optimizedMoment) = GradientDescentOptimization(
    sensorPositions, initialdipolePosition, initialdipoleMoment, observedFields, learningRate, iterations);

        Console.WriteLine("Optimized Dipole Position: ");
        Console.WriteLine($"X: {optimizedPosition[0]}, Y: {optimizedPosition[1]}, Z: {optimizedPosition[2]}");

        Console.WriteLine("Optimized Dipole Moment: ");
        Console.WriteLine($"X: {optimizedMoment[0]}, Y: {optimizedMoment[1]}, Z: {optimizedMoment[2]}");


    }

}
 

...全文
408 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2024-11-26
  • 打赏
  • 举报
回复

能量奇点公司的?

内容概要:本研究针对微电网在遭受拒绝服务(DoS)攻击面临的功率分配不均与电能质量问题,提了一种兼顾功率精确均分与电压频率质量恢复的抗攻击混合动态事件触发二次控制策略。该策略通过设计新型混合动态事件触发机制,有效减少控制器与分布式单元间的网络通信负担,同增强系统对DoS攻击的鲁棒性。研究构建了完整的微电网二次控制框架,整合了分布式协同控制算法与事件触发通信机制,在保证系统稳定性的同实现了对频率、电压偏差的快速调节和有功/无功功率的精确分配。通过Simulink平台进行仿真实验,验证了所提方法在遭受DoS攻击及正常运行工况下均能有效维持微电网的稳定运行与高质量电能输。; 适合人群:具备电力系统自动化、分布式控制或微电网相关基础知识,从事新能源、智能电网领域研究的研发人员及高年级研究生。; 使用场景及目标:① 解决微电网在通信受限及网络攻击场景下的协同控制难题;② 实现微电网在异常工况下功率均分与电能质量的双重优化;③ 为设计高安全性、高可靠性的智能微电网控制系统提供理论依据与仿真验证方案。; 阅读建议:本资源侧重于控制策略的设计与仿真验证,建议读者结合微电网基础理论与Simulink仿真技术,深入理解事件触发机制与抗DoS攻击控制算法的实现细节,并动手复现仿真案例以加深对系统动态性能与鲁棒性的认识。
内容概要:本文围绕《【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)》展开,系统阐述了采用粒子群优化算法(PSO)对风能与水力发电系统进行联合优化调度的研究方法与技术路径。研究聚焦于构建多能源互补协调的优化模型,详细论述了目标函数的设计、系统约束条件的处理、算法求解流程及收敛性分析,并通过Matlab编程实现了完整的仿真验证过程,有效提升了可再生能源系统的运行效率与稳定性。该工作属于电力系统智能优化领域,强调对高水平期刊论文的高精度复现,兼具理论深度与工程实用性,适用于科研复现、学术研究与教学参考。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源优化调度、智能算法应用的工程技术人员。; 使用场景及目标:①用于复现《太阳能学报》等高水平期刊中关于风-水电联合调度的EI/SCI论文;②掌握粒子群算法在多源协同优化中的建模、编码与求解关键技术;③辅助完成学位论文、科研项目申报或学术竞赛中的仿真建模任务; 阅读建议:建议结合文中提供的网盘资源下载完整代码与文档资料,按照目录结构循序渐进学习,重点关注算法实现细节、电力系统建模逻辑与参数设置方法,同可延伸学习灰狼优化算法、YALMIP工具包等先进优化技术,以全面提升科研仿真与创新能力。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧